AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::vector< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
float GetBoundaryRadius () const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinBoundaryRadius (const Unit *obj) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellGetFirstCurrentCastingSpell () const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
bool HasLeewayMovement () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SetTimedFacingToObject (WorldObject *object, uint32 time)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------—
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
template<typename Worker >
void DoForAllVisiblePlayers (Worker &&worker)
 
template<typename Worker >
void DoForAllVisibleWorldObjects (Worker &&worker)
 
void DestroyForVisiblePlayers ()
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
VisibilityDistanceType GetVisibilityOverrideType () const
 
bool IsVisibilityOverridden () const
 
bool IsZoneWideVisible () const
 
bool IsFarVisible () const
 
float GetVisibilityOverrideDistance () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
virtual bool IsUpdateNeeded ()
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
ObjectVisibilityContainerGetObjectVisibilityContainer ()
 
ObjectVisibilityContainer const & GetObjectVisibilityContainer () const
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit ()
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject ()
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsInvisibleDueToDespawn () const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
VisibilityDistanceType _visibilityDistanceOverrideType
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed?
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::vector<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
341{
342 // set current spells as deletable
343 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
344 if (m_currentSpells[i])
345 {
347 m_currentSpells[i] = nullptr;
348 }
349
351
352 delete i_motionMaster;
353 delete m_charmInfo;
354 delete movespline;
355
358 ASSERT(m_attackers.empty());
359
360 // pussywizard: clear m_sharedVision along with back references
361 if (!m_sharedVision.empty())
362 {
363 do
364 {
365 Player* p = *(m_sharedVision.begin());
366 p->m_isInSharedVisionOf.erase(this);
367 m_sharedVision.remove(p);
368 } while (!m_sharedVision.empty());
369 }
370
371 ASSERT(m_Controlled.empty());
372 ASSERT(m_appliedAuras.empty());
373 ASSERT(m_ownedAuras.empty());
374 ASSERT(m_removedAuras.empty());
375 ASSERT(m_gameObj.empty());
376 ASSERT(m_dynObj.empty());
377
378 if (m_movedByPlayer && m_movedByPlayer != this)
379 LOG_INFO("misc", "Unit::~Unit (A1)");
380
382}
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define CURRENT_MAX_SPELL
Definition Unit.h:545
Definition Player.h:1072
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2346
void SetReferencedFromCurrent(bool yes)
Definition Spell.h:570
bool m_duringRemoveFromWorld
Definition Unit.h:2166
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2078
AuraList m_removedAuras
Definition Unit.h:2082
ControlSet m_Controlled
Definition Unit.h:1990
Movement::MoveSpline * movespline
Definition Unit.h:2029
CharmInfo * m_charmInfo
Definition Unit.h:2099
MotionMaster * i_motionMaster
Definition Unit.h:2102
void _DeleteRemovedAuras()
Definition Unit.cpp:3864
DynObjectList m_dynObj
Definition Unit.h:2072
SafeUnitPointer m_movedByPlayer
Definition Unit.h:1992
AttackerSet m_attackers
Definition Unit.h:2064
Unit * m_attacking
Definition Unit.h:2065
GameObjectList m_gameObj
Definition Unit.h:2075
AuraMap m_ownedAuras
Definition Unit.h:2080
AuraApplicationMap m_appliedAuras
Definition Unit.h:2081
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition Unit.cpp:4398
SharedVisionList m_sharedVision
Definition Unit.h:2100

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( )
explicitprotected
205 : WorldObject(),
206 m_movedByPlayer(nullptr),
208 IsAIEnabled(false),
209 NeedChangeAI(false),
211 m_CreatedByPlayer(false),
213 i_AI(nullptr),
214 i_disabledAI(nullptr),
215 m_realRace(0),
216 m_race(0),
218 m_procDeep(0),
220 i_motionMaster(new MotionMaster(this)),
221 m_regenTimer(0),
222 m_ThreatMgr(this),
223 m_vehicle(nullptr),
224 m_vehicleKit(nullptr),
226 m_HostileRefMgr(this),
227 m_comboTarget(nullptr),
229{
230#ifdef _MSC_VER
231#pragma warning(default:4355)
232#endif
235
237
244
245 m_canDualWield = false;
246
247 m_rootTimes = 0;
248
249 m_state = 0;
251
252 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
253 m_currentSpells[i] = nullptr;
254
255 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
256 m_SummonSlot[i].Clear();
257
258 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
259 m_ObjectSlot[i].Clear();
260
262
263 m_interruptMask = 0;
264 m_transform = 0;
265 m_canModifyStats = false;
266
267 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
268 m_spellImmune[i].clear();
269
270 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
271 {
276 }
277 // implement 50% base damage from offhand
279
280 for (uint8 i = 0; i < MAX_ATTACK; ++i)
281 {
284
285 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
286 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
287 }
288
289 for (uint8 i = 0; i < MAX_STATS; ++i)
290 m_createStats[i] = 0.0f;
291
292 m_attacking = nullptr;
293 m_modMeleeHitChance = 0.0f;
295 m_modSpellHitChance = 0.0f;
297
298 m_CombatTimer = 0;
299 m_lastManaUse = 0;
300
301 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
302 m_threatModifier[i] = 1.0f;
303
304 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
305 m_speed_rate[i] = 1.0f;
306
307 m_charmInfo = nullptr;
308
310
311 // remove aurastates allowing special moves
312 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
313 m_reactiveTimer[i] = 0;
314
315 m_cleanupDone = false;
317
319
320 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
325
326 m_applyResilience = false;
327 _instantCast = false;
328
329 _lastLiquid = nullptr;
330
331 _oldFactionId = 0;
332
333 _isWalkingBeforeCharm = false;
334
336}
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ SERVERSIDE_VISIBILITY_GHOST
Definition SharedDefines.h:1285
#define MAX_STATS
Definition SharedDefines.h:276
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:303
@ MAX_SUMMON_SLOT
Definition SharedDefines.h:3569
@ GHOST_VISIBILITY_ALIVE
Definition SharedDefines.h:1292
#define MAX_GAMEOBJECT_SLOT
Definition SharedDefines.h:3573
#define MAX_SPELL_IMMUNITY
Definition SharedDefines.h:1415
@ UNIT_MASK_NONE
Definition UnitDefines.h:155
#define MAX_MOVE_TYPE
Definition UnitDefines.h:360
@ MINDAMAGE
Definition Unit.h:136
@ MAXDAMAGE
Definition Unit.h:137
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:167
@ UNIT_MOD_END
Definition Unit.h:169
@ OFF_ATTACK
Definition Unit.h:211
@ MAX_ATTACK
Definition Unit.h:213
@ BASE_ATTACK
Definition Unit.h:210
@ RANGED_ATTACK
Definition Unit.h:212
@ BASE_VALUE
Definition Unit.h:127
@ TOTAL_VALUE
Definition Unit.h:129
@ TOTAL_PCT
Definition Unit.h:130
@ BASE_PCT
Definition Unit.h:128
#define BASE_MAXDAMAGE
Definition Unit.h:41
@ MAX_REACTIVE
Definition Unit.h:600
#define BASE_MINDAMAGE
Definition Unit.h:40
@ UPDATEFLAG_LIVING
Definition UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:45
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:395
Definition MotionMaster.h:112
Definition MoveSpline.h:40
uint16 m_objectType
Definition Object.h:252
uint16 m_updateFlag
Definition Object.h:255
TypeID m_objectTypeId
Definition Object.h:254
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition Unit.h:2104
uint32 m_lastSanctuaryTime
Definition Unit.h:2006
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2115
uint32 m_transform
Definition Unit.h:2076
uint32 m_CombatTimer
Definition Unit.h:2149
bool m_canModifyStats
Definition Unit.h:2094
UnitAI * i_disabledAI
Definition Unit.h:2053
bool NeedChangeAI
Definition Unit.h:2013
uint32 m_state
Definition Unit.h:2148
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition Unit.h:2092
int32 m_attackTimer[MAX_ATTACK]
Definition Unit.h:2060
float m_modAttackSpeedPct[3]
Definition Unit.h:2003
uint8 m_realRace
Definition Unit.h:2055
Vehicle * m_vehicle
Definition Unit.h:2111
uint32 m_rootTimes
Definition Unit.h:2121
uint8 m_race
Definition Unit.h:2056
UnitAI * i_AI
Definition Unit.h:2052
uint32 _lastExtraAttackSpell
Definition Unit.h:2171
bool _instantCast
Definition Unit.h:2119
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition Unit.h:1995
RedirectThreatInfo _redirectThreatInfo
Definition Unit.h:2163
float m_createStats[MAX_STATS]
Definition Unit.h:2062
float m_modRangedHitChance
Definition Unit.h:1998
DeathState m_deathState
Definition Unit.h:2067
uint32 m_unitTypeMask
Definition Unit.h:2114
uint32 m_removedAurasCount
Definition Unit.h:2084
ThreatMgr m_ThreatMgr
Definition Unit.h:2107
Unit * m_comboTarget
Definition Unit.h:2159
AuraMap::iterator m_auraUpdateIterator
Definition Unit.h:2083
bool m_AutoRepeatFirstCast
Definition Unit.h:2058
uint16 m_delayed_unit_ai_notify_timer
Definition Unit.h:2025
int32 m_regenTimer
Definition Unit.h:2105
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2026
bool m_ControlledByPlayer
Definition Unit.h:2015
uint32 m_last_notify_mstime
Definition Unit.h:2023
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition Unit.h:2005
int8 m_comboPoints
Definition Unit.h:2160
uint32 _oldFactionId
faction before charm
Definition Unit.h:2168
int32 m_baseSpellCritChance
Definition Unit.h:2000
float m_modMeleeHitChance
Definition Unit.h:1997
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition Unit.h:2093
Position m_last_notify_position
Definition Unit.h:2022
Vehicle * m_vehicleKit
Definition Unit.h:2112
bool IsAIEnabled
Definition Unit.h:2012
HostileRefMgr m_HostileRefMgr
Definition Unit.h:2155
bool m_applyResilience
Definition Unit.h:2118
bool m_canDualWield
Definition Unit.h:1988
uint32 m_interruptMask
Definition Unit.h:2090
int32 m_procDeep
Definition Unit.h:2069
float m_speed_rate[MAX_MOVE_TYPE]
Definition Unit.h:2097
float m_modSpellHitChance
Definition Unit.h:1999
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition Unit.h:1994
bool m_cleanupDone
Definition Unit.h:2165
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition Unit.h:2169
bool m_CreatedByPlayer
Definition Unit.h:2016
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2024
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition Unit.h:2002
uint32 m_lastManaUse
Definition Unit.h:2150
WorldObject()
Definition Object.cpp:1039
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:613
void Relocate(float x, float y)
Definition Position.h:77
Definition ThreatMgr.h:293

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, Alive, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canDualWield, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, m_rootTimes, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
2144{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4484{
4486 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4487
4489
4490 if (aura->IsRemoved())
4491 return;
4492
4494 if (aura->IsSingleTarget())
4495 {
4496 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4497 /* @HACK: Player is not in world during loading auras.
4498 * Single target auras are not saved or loaded from database
4499 * but may be created as a result of aura links (player mounts with passengers)
4500 */
4501
4502 // register single target aura
4503 caster->GetSingleCastAuras().push_back(aura);
4504 // remove other single target auras
4505 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4506 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4507 {
4508 if ((*itr) != aura &&
4509 (*itr)->IsSingleTargetWith(aura))
4510 {
4511 (*itr)->Remove();
4512 itr = scAuras.begin();
4513 }
4514 else
4515 ++itr;
4516 }
4517 }
4518}
@ SPELL_AURA_CONTROL_VEHICLE
Definition SpellAuraDefines.h:299
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
bool IsRemoved() const
Definition SpellAuras.h:161
bool IsSingleTargetWith(Aura const *aura) const
Definition SpellAuras.cpp:1142
uint32 GetId() const
Definition SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition SpellAuras.h:166
bool IsSingleTarget() const
Definition SpellAuras.h:164
bool IsInWorld() const
Definition Object.h:108
ObjectGuid GetGUID() const
Definition Object.h:114
bool IsSingleTarget() const
Definition SpellInfo.cpp:1374
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition Unit.cpp:4736
std::list< Aura * > AuraList
Definition Unit.h:637
bool IsDuringRemoveFromWorld() const
Definition Unit.h:658
AuraList & GetSingleCastAuras()
Definition Unit.h:1352

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5558{
5559 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5560 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5561}
@ AURA_EFFECT_HANDLE_STAT
Definition SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4575{
4576 Aura* aura = aurApp->GetBase();
4577
4579
4580 if (aurApp->GetRemoveMode())
4581 return;
4582
4583 Unit* caster = aura->GetCaster();
4584
4585 // Update target aura state flag
4586 SpellInfo const* spellInfo = aura->GetSpellInfo();
4587 if (AuraStateType aState = spellInfo->GetAuraState())
4588 {
4589 uint32 aStateMask = (1 << (aState - 1));
4590 // force update so the new caster registers it
4591 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4593 else
4594 ModifyAuraState(aState, true);
4595 }
4596
4597 if (aurApp->GetRemoveMode())
4598 return;
4599
4600 // Sitdown on apply aura req seated
4603
4604 if (aurApp->GetRemoveMode())
4605 return;
4606
4607 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4608
4609 // apply effects of the aura
4610 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4611 {
4612 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4613 aurApp->_HandleEffect(i, true);
4614 }
4615
4616 sScriptMgr->OnAuraApply(this, aura);
4617}
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1638
std::uint32_t uint32
Definition Define.h:107
#define sScriptMgr
Definition ScriptMgr.h:728
#define PER_CASTER_AURA_STATE_MASK
Definition SharedDefines.h:1329
AuraStateType
Definition SharedDefines.h:1299
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
void _HandleEffect(uint8 effIndex, bool apply)
Definition SpellAuras.cpp:161
Aura * GetBase() const
Definition SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition SpellAuras.h:73
Definition SpellAuras.h:87
Unit * GetCaster() const
Definition SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition SpellAuras.cpp:1265
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:878
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2052
Definition SpellInfo.h:316
AuraStateType GetAuraState() const
Definition SpellInfo.cpp:2071
uint32 AuraInterruptFlags
Definition SpellInfo.h:353
Definition Unit.h:620
void ModifyAuraState(AuraStateType flag, bool apply)
Definition Unit.cpp:10596
void SetStandState(uint8 state)
Definition Unit.cpp:16813
bool IsSitState() const
Definition Unit.cpp:16798

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4561{
4562 ASSERT(aura);
4563 ASSERT(aura->HasEffect(effIndex));
4565 ASSERT(aurApp);
4566 if (!aurApp->GetEffectMask())
4567 _ApplyAura(aurApp, 1 << effIndex);
4568 else
4569 aurApp->_HandleEffect(effIndex, true);
4570}
Definition SpellAuras.h:37
uint8 GetEffectMask() const
Definition SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition SpellAuras.h:183
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition Unit.cpp:4574

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4523{
4524 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4526 // aura musn't be removed
4527 ASSERT(!aura->IsRemoved());
4528
4529 // aura mustn't be already applied on target
4530 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4531
4532 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4533 uint32 aurId = aurSpellInfo->Id;
4534
4535 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4536 // Xinef: Added IsAllowingDeadTarget check
4537 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4538 return nullptr;
4539
4540 Unit* caster = aura->GetCaster();
4541
4542 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4543 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4544
4545 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4546 // xinef: even if it gets removed, it will be reapplied in a second
4547 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4548 {
4549 m_interruptableAuras.push_back(aurApp);
4550 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4551 }
4552
4553 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4554 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4555
4556 aura->_ApplyForTarget(this, caster, aurApp);
4557 return aurApp;
4558}
WorldObject * GetOwner() const
Definition SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:492
bool IsPlayer() const
Definition Object.h:201
Player * ToPlayer()
Definition Object.h:202
bool IsDeathPersistent() const
Definition SpellInfo.cpp:1217
uint32 Id
Definition SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition SpellInfo.cpp:1227
void AddInterruptMask(uint32 mask)
Definition Unit.h:1523
bool IsAlive() const
Definition Unit.h:1707
AuraApplicationList m_interruptableAuras
Definition Unit.h:2088
AuraStateAurasMap m_auraStateAuras
Definition Unit.h:2089

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3865{
3866 while (!m_removedAuras.empty())
3867 {
3868 delete m_removedAuras.front();
3869 m_removedAuras.pop_front();
3870 }
3871}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19489{
19490 // Must be called only from aura handler
19491 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19492 return;
19493
19494 if (m_vehicle)
19495 {
19496 if (m_vehicle == vehicle)
19497 {
19498 if (seatId >= 0 && seatId != GetTransSeat())
19499 {
19500 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19501 ChangeSeat(seatId);
19502 }
19503
19504 return;
19505 }
19506 else
19507 {
19508 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19509 ExitVehicle();
19510 }
19511 }
19512
19513 if (!aurApp || aurApp->GetRemoveMode())
19514 return;
19515
19516 if (Player* player = ToPlayer())
19517 {
19518 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19519 return;
19520
19521 sScriptMgr->AnticheatSetUnderACKmount(player);
19522
19524 player->StopCastingCharm();
19525 player->StopCastingBindSight();
19526 Dismount();
19528
19529 // drop flag at invisible in bg
19530 if (Battleground* bg = player->GetBattleground())
19531 bg->EventPlayerDroppedFlag(player);
19532
19534 player->GetSession()->SendPacket(&data);
19535 }
19536
19537 ASSERT(!m_vehicle);
19538 m_vehicle = vehicle;
19539
19540 if (!m_vehicle->AddPassenger(this, seatId))
19541 {
19542 m_vehicle = nullptr;
19543 return;
19544 }
19545
19546 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19548}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
Definition Battleground.h:294
uint32 GetEntry() const
Definition Object.h:116
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4189
void Dismount()
Definition Unit.cpp:13622
bool IsOnVehicle(Unit const *vehicle) const
Definition Unit.h:1840
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5179
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:19550
Vehicle * GetVehicleKit() const
Definition Unit.h:1838
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5250
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19569
Unit * GetBase() const
May be called from scripts.
Definition Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition Vehicle.cpp:318
int8 GetTransSeat() const
Definition Object.h:689
Definition WorldPacket.h:26
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition Opcodes.h:1211

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19607{
19608 if (!m_vehicle)
19609 return;
19610
19611 // This should be done before dismiss, because there may be some aura removal
19614
19615 Player* player = ToPlayer();
19616
19617 // If player is on mouted duel and exits the mount should immediatly lose the duel
19618 if (player && player->duel && player->duel->IsMounted)
19619 player->DuelComplete(DUEL_FLED);
19620
19621 Vehicle* vehicle = m_vehicle;
19622 Unit* vehicleBase = m_vehicle->GetBase();
19623 m_vehicle = nullptr;
19624
19625 if (!vehicleBase)
19626 return;
19627
19628 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19629
19630 Position pos;
19631 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19632 if (exitPosition)
19633 pos = *exitPosition;
19634 else
19635 {
19636 // Set exit position to vehicle position and use the current orientation
19637 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19638 pos.SetOrientation(vehicleBase->GetOrientation());
19639
19640 // Change exit position based on seat entry addon data
19641 if (seatAddon)
19642 {
19644 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19646 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19647 }
19648 }
19649
19651
19652 if (player)
19653 {
19655
19656 sScriptMgr->AnticheatSetUnderACKmount(player);
19657 }
19659 {
19661 data << GetPackGUID();
19662 SendMessageToSet(&data, false);
19663 }
19664
19665 // xinef: hack for flameleviathan seat vehicle
19666 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19667 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19668 {
19669 Movement::MoveSplineInit init(this);
19670 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19671 init.SetFacing(vehicleBase->GetOrientation());
19672 init.SetTransportExit();
19673 init.Launch();
19674 }
19675 else
19676 {
19677 float o = pos.GetAngle(this);
19678 Movement::MoveSplineInit init(this);
19679 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19680 init.SetFacing(GetOrientation());
19681 init.SetTransportExit();
19682 init.Launch();
19683 DisableSpline();
19684 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19686 }
19687
19688 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19689 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19690 {
19692 }
19693
19694 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19695 if (((Minion*)vehicleBase)->GetOwner() == this)
19696 {
19697 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19698 {
19699 vehicle->Dismiss();
19700 }
19701 else if (vehicleBase->IsCreature())
19702 {
19703 vehicle->Uninstall();
19704 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
19705 }
19706
19707 // xinef: ugly hack, no appripriate hook later to cast spell
19708 if (player)
19709 {
19710 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19711 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19712 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19713 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19714 }
19715 }
19716
19718 {
19719 // Vehicle just died, we die too
19720 if (vehicleBase->getDeathState() == DeathState::JustDied)
19722 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19723 else
19724 ToTempSummon()->UnSummon(2000); // Approximation
19725 }
19726
19727 if (player)
19728 {
19730 player->SetCanTeleport(true);
19731 }
19732}
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:905
@ DUEL_FLED
Definition SharedDefines.h:3880
@ MOVEMENTFLAG_ROOT
Definition UnitDefines.h:376
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_MASK_MINION
Definition UnitDefines.h:157
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_MOVE
Definition UnitDefines.h:189
@ VEHICLE_SPELL_PARACHUTE
Definition VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition VehicleDefines.h:70
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition EventProcessor.h:103
uint64 CalculateTime(uint64 t_offset) const
Definition EventProcessor.cpp:159
Definition TemporarySummon.h:77
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:627
Definition MoveSplineInit.h:71
PackedGuid const & GetPackGUID() const
Definition Object.h:115
bool IsCreature() const
Definition Object.h:205
void SetCanTeleport(bool value)
Definition Player.h:2508
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6453
void SetFallInformation(uint32 time, float z)
Definition Player.h:2347
std::unique_ptr< DuelInfo > duel
Definition Player.h:1880
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14259
uint32 GetDelayedOperations() const
Definition Player.h:2105
virtual void UnSummon(uint32 msTime=0)
Definition TemporarySummon.cpp:287
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14658
Unit * GetOwner() const
Definition Unit.cpp:10699
DeathState getDeathState()
Definition Unit.h:1704
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition Unit.h:1673
TempSummon * ToTempSummon()
Definition Unit.h:686
void DisableSpline()
Definition Unit.cpp:638
void AddUnitState(uint32 f)
Definition Unit.h:690
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18135
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:729
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1194
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:696
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition Unit.cpp:19244
Definition Vehicle.h:101
Definition Vehicle.h:28
void Dismiss()
Definition Vehicle.cpp:539
VehicleEntry const * GetVehicleInfo() const
Definition Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition Vehicle.cpp:460
void Uninstall()
Definition Vehicle.cpp:101
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition Vehicle.cpp:237
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2065
EventProcessor m_Events
Definition Object.h:731
@ SMSG_SPLINE_MOVE_UNROOT
Definition Opcodes.h:802
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition Position.h:27
void RelocateOffset(const Position &offset)
Definition Position.cpp:59
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
void SetOrientation(float orientation)
Definition Position.h:116
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122
float GetAngle(const Position *pos) const
Definition Position.cpp:78
Definition DBCStructure.h:2028
uint32 m_ID
Definition DBCStructure.h:2029
Definition VehicleDefines.h:86
float ExitParameterO
Definition VehicleDefines.h:96
float ExitParameterX
Definition VehicleDefines.h:93
float ExitParameterY
Definition VehicleDefines.h:94
float ExitParameterZ
Definition VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition VehicleDefines.h:97

References EventProcessor::AddEvent(), AddUnitState(), EventProcessor::CalculateTime(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), Object::IsCreature(), JustDied, KnockbackFrom(), Movement::MoveSplineInit::Launch(), WorldObject::m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, VEHICLE_SPELL_SHADE_CONTROL_END, VehicleExitParamDest, and VehicleExitParamOffset.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
14106{
14107 ASSERT(target);
14108
14109 // can assist to self
14110 if (this == target)
14111 return true;
14112
14113 // can't assist unattackable units or GMs
14114 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14115 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14116 return false;
14117
14118 // can't assist own vehicle or passenger
14119 if (m_vehicle)
14120 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14121 return false;
14122
14123 // can't assist invisible
14124 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14125 return false;
14126
14127 // can't assist dead
14128 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14129 return false;
14130
14131 // can't assist untargetable
14132 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14133 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14134 return false;
14135
14136 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14137 {
14138 // xinef: do not allow to assist non attackable units
14139 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14140 return false;
14141
14143 {
14144 if (target->IsImmuneToPC())
14145 return false;
14146 }
14147 else
14148 {
14149 if (target->IsImmuneToNPC())
14150 return false;
14151 }
14152 }
14153
14154 // can't assist non-friendly targets
14155 if (GetReactionTo(target) < REP_NEUTRAL
14156 && target->GetReactionTo(this) < REP_NEUTRAL
14157 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14158 return false;
14159
14160 // PvP case
14161 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14162 {
14163 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14165 {
14166 Player const* selfPlayerOwner = GetAffectingPlayer();
14167 if (selfPlayerOwner && targetPlayerOwner)
14168 {
14169 // can't assist player which is dueling someone
14170 if (selfPlayerOwner != targetPlayerOwner
14171 && targetPlayerOwner->duel)
14172 return false;
14173 }
14174 // can't assist player in ffa_pvp zone from outside
14175 if (target->IsFFAPvP() && !IsFFAPvP())
14176 return false;
14177
14178 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14179 if (target->IsPvP())
14180 if (IsInSanctuary() && !target->IsInSanctuary())
14181 return false;
14182 }
14183 }
14184 // PvC case - player can assist creature only if has specific type flags
14185 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14187 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14188 && !target->IsPvP())
14189 {
14190 if (Creature const* creatureTarget = target->ToCreature())
14191 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14192 }
14193 return true;
14194}
@ REP_NEUTRAL
Definition SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition SharedDefines.h:2732
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition SharedDefines.h:2718
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition SharedDefines.h:639
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition SharedDefines.h:628
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition SharedDefines.h:618
@ UNIT_STATE_UNATTACKABLE
Definition UnitDefines.h:207
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:251
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:275
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:253
Definition Creature.h:43
Creature * ToCreature()
Definition Object.h:206
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10138
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:702
bool IsInSanctuary() const
Definition Unit.h:982
bool IsFFAPvP() const
Definition Unit.h:984
Player * GetAffectingPlayer() const
Definition Unit.cpp:10724
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1705

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13983{
13984 ASSERT(target);
13985
13986 // can't attack self
13987 if (this == target)
13988 return false;
13989
13990 // can't attack unattackable units or GMs
13991 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13992 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13993 return false;
13994
13995 // can't attack own vehicle or passenger
13996 if (m_vehicle)
13997 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13998 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13999 return false;
14000
14001 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
14002 //Ignore stealth if target is player and unit in combat with same player
14003 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
14004 return false;
14005
14006 // can't attack dead
14007 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14008 return false;
14009
14010 // can't attack untargetable
14011 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14012 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14013 return false;
14014
14015 if (Player const* playerAttacker = ToPlayer())
14016 {
14017 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
14018 return false;
14019 }
14020 // check flags
14022 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
14023 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
14024 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
14025 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
14026 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
14027 return false;
14028
14029 // CvC case - can attack each other only when one of them is hostile
14031 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
14032
14033 // PvP, PvC, CvP case
14034 // can't attack friendly targets
14035 ReputationRank repThisToTarget = GetReactionTo(target);
14036 ReputationRank repTargetToThis;
14037
14038 if (repThisToTarget > REP_NEUTRAL
14039 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
14040 return false;
14041
14042 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
14043 if (repThisToTarget == REP_NEUTRAL &&
14044 repTargetToThis <= REP_NEUTRAL)
14045 {
14046 Player* owner = GetAffectingPlayer();
14047 Unit const* const thisUnit = owner ? owner : this;
14048 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
14049 !(target->IsCreature() && thisUnit->IsCreature()))
14050 {
14051 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
14052 Unit const* creature = target->IsCreature() ? target : thisUnit;
14053
14054 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
14055 {
14056 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
14057 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
14058 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
14059 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
14060 return false;
14061 }
14062 }
14063 }
14064
14065 Creature const* creatureAttacker = ToCreature();
14066 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
14067 return false;
14068
14069 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
14070 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
14071
14072 // check duel - before sanctuary checks
14073 if (playerAffectingAttacker && playerAffectingTarget)
14074 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
14075 return true;
14076
14077 // PvP case - can't attack when attacker or target are in sanctuary
14078 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
14079 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
14080 return false;
14081
14082 // additional checks - only PvP case
14083 if (playerAffectingAttacker && playerAffectingTarget)
14084 {
14085 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
14086 return false;
14087
14088 if (target->IsPvP())
14089 return true;
14090
14091 if (IsFFAPvP() && target->IsFFAPvP())
14092 return true;
14093
14095 }
14096 return true;
14097}
@ FACTION_FLAG_AT_WAR
Definition DBCEnums.h:308
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ TYPEMASK_DYNAMICOBJECT
Definition ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:367
@ PLAYER_FLAGS_UBER
Definition Player.h:488
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition SharedDefines.h:584
ReputationRank
Definition SharedDefines.h:179
@ REP_HOSTILE
Definition SharedDefines.h:181
@ UNIT_BYTE2_FLAG_UNK1
Definition UnitDefines.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:270
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition UnitDefines.h:266
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:257
#define WORLD_TRIGGER
Definition Unit.h:38
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:209
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:938
ReputationMgr & GetReputationMgr()
Definition Player.h:2132
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition ReputationMgr.h:106
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10108
bool IsPvP() const
Definition Unit.h:983
bool HasStealthAura() const
Definition Unit.h:1755
bool IsInCombatWith(Unit const *who) const
Definition Unit.cpp:20902
bool IsImmuneToNPC() const
Definition Unit.h:874
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10310
bool IsImmuneToPC() const
Definition Unit.h:872
bool IsInCombat() const
Definition Unit.h:879
uint32 type_flags
Definition CreatureData.h:223
Definition DBCStructure.h:907
Definition ReputationMgr.h:41
Definition DBCStructure.h:939

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4766{
4767 if (apply)
4768 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4769 else
4770 m_modAuras[aurEff->GetAuraType()].erase(std::remove(m_modAuras[aurEff->GetAuraType()].begin(), m_modAuras[aurEff->GetAuraType()].end(), aurEff), m_modAuras[aurEff->GetAuraType()].end());
4771}
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:448
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition Unit.h:2086

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6219{
6220 m_dynObj.push_back(dynObj);
6221}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5552{
5553 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5554 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5555}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2145{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4737{
4738 //SpellInfo const* spellProto = aura->GetSpellInfo();
4739
4740 // passive spell special case (only non stackable with ranks)
4741
4742 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4743 // if (spellProto->IsPassiveStackableWithRanks())
4744 // return;
4745
4746 bool remove = false;
4747 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4748 {
4749 if (remove)
4750 {
4751 remove = false;
4752 i = m_appliedAuras.begin();
4753 }
4754
4755 if (aura->CanStackWith(i->second->GetBase(), true))
4756 continue;
4757
4759 if (i == m_appliedAuras.end())
4760 break;
4761 remove = true;
4762 }
4763}
@ AURA_REMOVE_BY_DEFAULT
Definition SpellAuraDefines.h:392
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition SpellAuras.cpp:2021
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4845

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4424{
4425 ASSERT(casterGUID || caster);
4426 if (!casterGUID)
4427 casterGUID = caster->GetGUID();
4428
4429 // Xinef: Hax for mixology, best solution qq
4430 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4431 return nullptr;
4432
4433 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4434 if (!newAura->IsMultiSlotAura())
4435 {
4436 // check if cast item changed
4437 ObjectGuid castItemGUID;
4438 if (castItem)
4439 castItemGUID = castItem->GetGUID();
4440
4441 // find current aura from spell and change it's stackamount, or refresh it's duration
4442 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4443 {
4444 // effect masks do not match
4445 // extremely rare case
4446 // let's just recreate aura
4447 if (effMask != foundAura->GetEffectMask())
4448 return nullptr;
4449
4450 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4451 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4452 {
4453 if (!foundAura->HasEffect(i))
4454 continue;
4455
4456 int bp;
4457 if (baseAmount)
4458 bp = *(baseAmount + i);
4459 else
4460 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4461
4462 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4463 *oldBP = bp;
4464 }
4465
4466 // correct cast item guid if needed
4467 if (castItemGUID != foundAura->GetCastItemGUID())
4468 {
4469 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4470 *oldGUID = castItemGUID;
4471 }
4472
4473 // try to increase stack amount
4474 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4475 sScriptMgr->OnAuraApply(this, foundAura);
4476 return foundAura;
4477 }
4478 }
4479
4480 return nullptr;
4481}
std::int32_t int32
Definition Define.h:103
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition SpellInfo.h:198
#define sSpellMgr
Definition SpellMgr.h:825
Definition ObjectGuid.h:118
static ObjectGuid const Empty
Definition ObjectGuid.h:120
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:4829

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4716{
4717 // aura can be removed from unit only if it's applied on it, shouldn't happen
4718 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4719
4720 uint32 spellId = aurApp->GetBase()->GetId();
4721 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4722
4723 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4724 {
4725 if (iter->second == aurApp)
4726 {
4727 _UnapplyAura(iter, removeMode);
4728 return;
4729 }
4730 else
4731 ++iter;
4732 }
4733 ABORT();
4734}
#define ABORT
Definition Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition Unit.h:631
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition Unit.cpp:4620

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4621{
4622 AuraApplication* aurApp = i->second;
4623 ASSERT(aurApp);
4624 ASSERT(!aurApp->GetRemoveMode());
4625 ASSERT(aurApp->GetTarget() == this);
4626
4627 aurApp->SetRemoveMode(removeMode);
4628 Aura* aura = aurApp->GetBase();
4629 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4630
4631 // dead loop is killing the server probably
4632 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4633
4635
4636 Unit* caster = aura->GetCaster();
4637
4638 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4639 m_appliedAuras.erase(i);
4640
4641 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4642 // xinef: event if it gets removed, it will be reapplied in a second
4643 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4644 {
4645 m_interruptableAuras.remove(aurApp);
4647 }
4648
4649 bool auraStateFound = false;
4650 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4651 if (auraState)
4652 {
4653 bool canBreak = false;
4654 // Get mask of all aurastates from remaining auras
4655 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4656 {
4657 if (itr->second == aurApp)
4658 {
4659 m_auraStateAuras.erase(itr);
4660 itr = m_auraStateAuras.lower_bound(auraState);
4661 canBreak = true;
4662 continue;
4663 }
4664 auraStateFound = true;
4665 ++itr;
4666 }
4667 }
4668
4669 aurApp->_Remove();
4670 aura->_UnapplyForTarget(this, caster, aurApp);
4671
4672 // remove effects of the spell - needs to be done after removing aura from lists
4673 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4674 {
4675 if (aurApp->HasEffect(itr))
4676 aurApp->_HandleEffect(itr, false);
4677 }
4678
4679 // all effect mustn't be applied
4680 ASSERT(!aurApp->GetEffectMask());
4681
4682 // Remove totem at next update if totem loses its aura
4683 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4684 {
4685 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4687 }
4688
4689 // Remove aurastates only if needed and were not found
4690 if (auraState)
4691 {
4692 if (!auraStateFound)
4693 ModifyAuraState(auraState, false);
4694 else
4695 {
4696 // update for casters, some shouldn't 'see' the aura state
4697 uint32 aStateMask = (1 << (auraState - 1));
4698 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4700 }
4701 }
4702
4703 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4704
4705 // only way correctly remove all auras from list
4706 //if (removedAuras != m_removedAurasCount) new aura may be added
4707 i = m_appliedAuras.begin();
4708
4709 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4710
4711 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4712 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4713}
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition Totem.h:25
Unit * GetTarget() const
Definition SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition SpellAuras.h:72
void _Remove()
Definition SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:515
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition CreatureAI.h:232
CreatureAI * AI() const
Definition Creature.h:141
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition TemporarySummon.cpp:396
Totem * ToTotem()
Definition Unit.h:685
void UpdateInterruptMask()
Definition Unit.cpp:769
bool IsTotem() const
Definition Unit.h:749

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), JustDied, LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6224{
6225 m_dynObj.remove(dynObj);
6226}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3932{
3933 SpellInfo const* spellProto = nullptr;
3935 {
3937 }
3938
3939 if (!spellProto)
3940 {
3941 return;
3942 }
3943
3944 static uint32 const HUNTER_AUTOSHOOT = 75;
3945
3946 // Check "realtime" interrupts
3947 if ((IsPlayer() && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3948 {
3949 // cancel wand shoot
3950 if (spellProto->Id != HUNTER_AUTOSHOOT)
3952 m_AutoRepeatFirstCast = true;
3953 return;
3954 }
3955
3956 // Apply delay (Hunter's autoshoot not affected)
3957 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3958 {
3960 }
3961
3962 m_AutoRepeatFirstCast = false;
3963
3964 // Check for ranged attack timer
3966 {
3968 if (result != SPELL_CAST_OK)
3969 {
3970 if (spellProto->Id != HUNTER_AUTOSHOOT)
3971 {
3973 }
3974
3975 return;
3976 }
3977
3978 // We want to shoot
3979 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3980 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3981
3982 // Reset attack
3984 }
3985}
SpellCastResult
Definition SharedDefines.h:959
@ SPELL_CAST_OK
Definition SharedDefines.h:1149
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:541
Definition Spell.h:294
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3471
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5670
SpellInfo const *const m_spellInfo
Definition Spell.h:530
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4108
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4159
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:830
bool isMoving() const
Definition Unit.h:1622
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:832
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:833
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:644

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3874{
3877
3878 // remove finished spells from current pointers
3879 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3880 {
3881 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3882 {
3884 m_currentSpells[i] = nullptr; // remove pointer
3885 }
3886 }
3887
3888 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3890 {
3891 Aura* i_aura = m_auraUpdateIterator->second;
3892 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3893 i_aura->UpdateOwner(time, this);
3894 }
3895
3896 // remove expired auras - do that after updates(used in scripts?)
3897 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3898 {
3899 if (i->second->IsExpired())
3901 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3902 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3903 else
3904 ++i;
3905 }
3906
3907 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3908 if (itr->second->IsNeedClientUpdate())
3909 itr->second->ClientUpdate();
3910
3912
3913 if (!m_gameObj.empty())
3914 {
3915 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3916 {
3917 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3918 if (!go->isSpawned())
3919 {
3920 go->SetOwnerGUID(ObjectGuid::Empty);
3921 go->SetRespawnTime(0);
3922 go->Delete();
3923 m_gameObj.erase(itr++);
3924 continue;
3925 }
3926 ++itr;
3927 }
3928 }
3929}
@ AURA_REMOVE_BY_CANCEL
Definition SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition Spell.h:236
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition SpellAuras.cpp:756
Definition GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4774
void _UpdateAutoRepeatSpell()
Definition Unit.cpp:3931
VisibleAuraMap m_visibleAuras
Definition Unit.h:2095
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:115

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
18980{
18981 if (!spellInfo)
18982 return nullptr;
18983
18984 if (target->IsImmunedToSpell(spellInfo))
18985 return nullptr;
18986
18987 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18988 {
18989 if (!(effMask & (1 << i)))
18990 continue;
18991 if (target->IsImmunedToSpellEffect(spellInfo, i))
18992 effMask &= ~(1 << i);
18993 }
18994
18995 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18996 {
18997 aura->ApplyForTargets();
18998 return aura;
18999 }
19000 return nullptr;
19001}
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition SpellAuras.cpp:326
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition Unit.cpp:13104
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition Unit.cpp:13014

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18965{
18966 if (!target)
18967 return nullptr;
18968
18969 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18970 if (!spellInfo)
18971 return nullptr;
18972
18973 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18974 return nullptr;
18975
18976 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18977}
#define MAX_EFFECT_MASK
Definition DBCStructure.h:1639
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition SharedDefines.h:467
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:399
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:18964

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pallid_horror::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
962{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition Unit.h:2161

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
959{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition Unit.cpp:16925

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16926{
16927 if (!count)
16928 {
16929 return;
16930 }
16931
16932 if (target && target != m_comboTarget)
16933 {
16934 if (m_comboTarget)
16935 {
16937 }
16938
16939 m_comboTarget = target;
16940 m_comboPoints = count;
16941 target->AddComboPointHolder(this);
16942 }
16943 else
16944 {
16945 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16946 }
16947
16949}
void SendComboPoints()
Definition Unit.cpp:16968
void AddComboPointHolder(Unit *unit)
Definition Unit.h:962
void RemoveComboPointHolder(Unit *unit)
Definition Unit.h:963

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2797{
2799 if (!targetGUID)
2800 {
2801 if (ObjectGuid selection = GetTarget())
2802 {
2803 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2804 }
2805 else
2806 return;
2807 }
2808
2809 extraAttacksTargets[targetGUID] += count;
2810}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition Unit.h:2172
ObjectGuid _lastDamagedTargetGuid
Definition Unit.h:2173
ObjectGuid GetTarget() const
Definition Unit.h:811

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
733{ m_movementInfo.flags2 |= f; }
MovementInfo m_movementInfo
Definition Object.h:693
uint16 flags2
Definition Object.h:292

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition Unit.h:2157

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6280{
6281 if (!gameObj || gameObj->GetOwnerGUID())
6282 return;
6283
6284 m_gameObj.push_back(gameObj->GetGUID());
6285 gameObj->SetOwnerGUID(GetGUID());
6286
6287 if (IsPlayer() && gameObj->GetSpellId())
6288 {
6289 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6290 // Need disable spell use for owner
6291 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6292 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6293 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6294 }
6295}
uint32 GetSpellId() const
Definition GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10946
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1523{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17385{
17386 if (!IsPlayer())
17387 return;
17388
17389 m_petAuras.insert(petSpell);
17390 if (Pet* pet = ToPlayer()->GetPet())
17391 pet->CastPetAura(petSpell);
17392 else if (Unit* charm = GetCharm())
17393 charm->CastPetAura(petSpell);
17394}
Definition Pet.h:41
Unit * GetCharm() const
Definition Unit.cpp:10770
PetAuraSet m_petAuras
Definition Unit.h:2010
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:215

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11269{
11270 if (m_sharedVision.empty())
11271 setActive(true);
11272
11273 m_sharedVision.push_back(player);
11274 player->m_isInSharedVisionOf.insert(this);
11275}
void setActive(bool isActiveObject)
Definition Object.cpp:1065

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
1934{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition Unit.h:2019

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14759{
14760 // Only mobs can manage threat lists
14762 {
14763 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14764 }
14765}
@ UNIT_STATE_EVADE
Definition UnitDefines.h:191
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition Unit.h:691
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition Unit.cpp:14719

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_zuljin_vortex::ChangeToNewPlayer(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_dark_fiend::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from Object.

15780{
15781 if (!IsInWorld())
15782 {
15784 }
15785}
void AddToWorld() override
Definition Object.cpp:1175

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
690{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
697{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17142{
17143 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17144 if (val > 0)
17145 {
17147 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17148 }
17149 else
17150 {
17152 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17153 }
17154 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17155}
std::uint16_t uint16
Definition Define.h:108
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Util.h:50
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition Object.cpp:818
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:859

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17158{
17159 if (val > 0)
17161 else
17163}
@ UNIT_MOD_CAST_SPEED
Definition UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15232{
15233 // Checking for existing in the table
15234 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15235 {
15236 if (i->DRGroup != group)
15237 continue;
15238
15239 if (apply)
15240 i->stack += 1;
15241 else if (i->stack)
15242 {
15243 i->stack -= 1;
15244 // Remember time after last aura from group removed
15245 if (i->stack == 0)
15246 i->hitTime = GameTime::GetGameTimeMS().count();
15247 }
15248 break;
15249 }
15250}
Diminishing m_Diminishing
Definition Unit.h:2153
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15153{
15154 // xinef: dont apply diminish to self casts
15155 if (duration == -1 || group == DIMINISHING_NONE)
15156 return 1.0f;
15157
15158 // test pet/charm masters instead pets/charmeds
15159 Unit const* targetOwner = GetOwner();
15160 Unit const* casterOwner = caster->GetOwner();
15161
15162 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15163 if (limitduration > 0 && duration > limitduration)
15164 {
15165 Unit const* target = targetOwner ? targetOwner : this;
15166 Unit const* source = casterOwner ? casterOwner : caster;
15167
15168 if ((target->IsPlayer()
15170 && source->IsPlayer())
15171 duration = limitduration;
15172 }
15173
15174 float mod = 1.0f;
15175
15176 if (group == DIMINISHING_TAUNT)
15177 {
15179 {
15180 DiminishingLevels diminish = Level;
15181 switch (diminish)
15182 {
15184 break;
15186 mod = 0.65f;
15187 break;
15189 mod = 0.4225f;
15190 break;
15192 mod = 0.274625f;
15193 break;
15195 mod = 0.0f;
15196 break;
15197 default:
15198 break;
15199 }
15200 }
15201 }
15202 // Some diminishings applies to mobs too (for example, Stun)
15204 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15205 || (IsCreature() && ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))))
15207 {
15208 DiminishingLevels diminish = Level;
15209 switch (diminish)
15210 {
15212 break;
15214 mod = 0.5f;
15215 break;
15217 mod = 0.25f;
15218 break;
15220 mod = 0.0f;
15221 break;
15222 default:
15223 break;
15224 }
15225 }
15226
15227 duration = int32(duration * mod);
15228 return mod;
15229}
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition CreatureData.h:65
@ Level
Requires the player to be at least a specific level.
@ DIMINISHING_NONE
Definition SharedDefines.h:3508
@ DIMINISHING_TAUNT
Definition SharedDefines.h:3526
@ DRTYPE_PLAYER
Definition SharedDefines.h:3501
@ DRTYPE_ALL
Definition SharedDefines.h:3502
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition SpellMgr.cpp:245
DiminishingLevels
Definition Unit.h:263
@ DIMINISHING_LEVEL_3
Definition Unit.h:266
@ DIMINISHING_LEVEL_1
Definition Unit.h:264
@ DIMINISHING_LEVEL_4
Definition Unit.h:268
@ DIMINISHING_LEVEL_IMMUNE
Definition Unit.h:267
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition Unit.h:269
@ DIMINISHING_LEVEL_2
Definition Unit.h:265
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:73

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, GetDiminishingReturnsGroupType(), GetOwner(), Creature::HasFlagsExtra(), Object::IsCreature(), Object::IsPlayer(), Level, and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14935{
14936 if (Player* modOwner = GetSpellModOwner())
14937 {
14938 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14939 switch (effect_index)
14940 {
14941 case 0:
14942 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14943 break;
14944 case 1:
14945 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14946 break;
14947 case 2:
14948 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14949 break;
14950 }
14951 }
14952 return value;
14953}
@ SPELLMOD_EFFECT2
Definition SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition SpellDefines.h:79
Player * GetSpellModOwner() const
Definition Unit.cpp:16664

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
19029{
19030 // player mounted on multi-passenger mount is also classified as vehicle
19031 if (victim->IsVehicle() && !victim->IsPlayer())
19032 return;
19033
19034 Unit const* target = nullptr;
19035 if (victim->IsPlayer())
19036 target = victim;
19037 else if (victim->IsCreature())
19038 {
19039 if (Unit* owner = victim->GetOwner())
19040 if (owner->IsPlayer())
19041 target = owner;
19042 }
19043
19044 if (!target)
19045 return;
19046
19047 switch (type)
19048 {
19050 // Crit chance reduction works against nonpets
19051 if (crit)
19052 *crit -= target->GetMeleeCritChanceReduction();
19053 if (damage)
19054 {
19055 if (isCrit)
19056 *damage -= target->GetMeleeCritDamageReduction(*damage);
19057 *damage -= target->GetMeleeDamageReduction(*damage);
19058 }
19059 break;
19061 // Crit chance reduction works against nonpets
19062 if (crit)
19063 *crit -= target->GetRangedCritChanceReduction();
19064 if (damage)
19065 {
19066 if (isCrit)
19067 *damage -= target->GetRangedCritDamageReduction(*damage);
19068 *damage -= target->GetRangedDamageReduction(*damage);
19069 }
19070 break;
19072 // Crit chance reduction works against nonpets
19073 if (crit)
19074 *crit -= target->GetSpellCritChanceReduction();
19075 if (damage)
19076 {
19077 if (isCrit)
19078 *damage -= target->GetSpellCritDamageReduction(*damage);
19079 *damage -= target->GetSpellDamageReduction(*damage);
19080 }
19081 break;
19082 default:
19083 break;
19084 }
19085}
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:233
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:234
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:232
float GetSpellCritChanceReduction() const
Definition Unit.h:1199
float GetRangedCritChanceReduction() const
Definition Unit.h:1198
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition Unit.h:1203
float GetMeleeCritChanceReduction() const
Definition Unit.h:1197
uint32 GetRangedDamageReduction(uint32 damage) const
Definition Unit.h:1191
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition Unit.h:1202
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition Unit.h:1201
uint32 GetSpellDamageReduction(uint32 damage) const
Definition Unit.h:1192
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition Unit.h:1190

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1128{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition Object.cpp:811
void apply(T *val)
Definition ByteConverter.h:40

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13515{
13516 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13517
13518 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13519 {
13520 // Create dispel mask by dispel type
13521 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13522 // Dispel all existing auras vs current dispel type
13524 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13525 {
13526 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13527 if (spell->GetDispelMask() & dispelMask)
13528 {
13529 // Dispel aura
13530 RemoveAura(itr);
13531 }
13532 else
13533 ++itr;
13534 }
13535 }
13536}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition SharedDefines.h:445
@ IMMUNITY_DISPEL
Definition SharedDefines.h:1409
uint32 GetDispelMask() const
Definition SpellInfo.cpp:2052
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13487
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:629
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1306

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13488{
13489 if (apply)
13490 {
13491 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13492 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13493 return;
13494
13495 SpellImmune immune;
13496 immune.spellId = spellId;
13497 immune.type = type;
13498 immune.blockType = blockType;
13499 m_spellImmune[op].push_back(std::move(immune));
13500 }
13501 else
13502 {
13503 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13504 {
13505 if (itr->spellId == spellId && itr->type == type)
13506 {
13507 m_spellImmune[op].erase(itr);
13508 break;
13509 }
13510 }
13511 }
13512}
Definition Unit.cpp:13478
Definition SpellDefines.h:174
uint32 blockType
Definition SpellDefines.h:179
uint32 spellId
Definition SpellDefines.h:177
uint32 type
Definition SpellDefines.h:178

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_army_of_the_dead_passive::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_pet_intellect_spirit_resilience_scaling::HandleEffectApply(), spell_pet_spellhit_expertise_spellpen_scaling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_necrotic_shard::npc_necrotic_shard(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), npc_sanguine_spirit::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and Creature::UpdateEntry().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
1022{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15443{
15444 if (val == -100.0f) // prevent set var to zero
15445 val = -99.99f;
15446 float var = GetStat(stat) * val / 100.0f;
15447 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15448}
float GetStat(Stats stat) const
Definition Unit.h:997

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14747{
14748 if (!HasThreatAura() || fThreat < 0)
14749 return fThreat;
14750
14751 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14752
14753 return fThreat * m_threatModifier[school];
14754}
SpellSchools
Definition SharedDefines.h:293
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition SharedDefines.h:329
bool HasThreatAura() const
Definition Unit.h:1745

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10347{
10348 if (!victim || victim == this)
10349 return false;
10350
10351 // dead units can neither attack nor be attacked
10352 if (!IsAlive() || !victim->IsAlive())
10353 return false;
10354
10355 // pussywizard: check map, world, phase >_> multithreading crash fix
10356 if (!IsInMap(victim) || !InSamePhase(victim))
10357 return false;
10358
10359 // player cannot attack in mount state
10360 if (IsPlayer() && IsMounted())
10361 return false;
10362
10363 // creatures cannot attack while evading
10364 Creature* creature = ToCreature();
10365 if (creature && creature->IsInEvadeMode())
10366 {
10367 return false;
10368 }
10369
10370 // creatures should not try to attack the player during polymorph
10371 if (creature && creature->IsPolymorphed())
10372 {
10373 return false;
10374 }
10375
10376 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10377 // return false;
10378
10379 // nobody can attack GM in GM-mode
10380 if (victim->IsPlayer())
10381 {
10382 if (victim->ToPlayer()->IsGameMaster())
10383 return false;
10384 }
10385 else
10386 {
10387 if (victim->ToCreature()->IsEvadingAttacks())
10388 return false;
10389 }
10390
10391 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10393 return false;
10394
10395 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10396 if (HasUnattackableAura())
10398
10399 if (m_attacking)
10400 {
10401 if (m_attacking == victim)
10402 {
10403 // switch to melee attack from ranged/magic
10404 if (meleeAttack)
10405 {
10407 {
10409 SendMeleeAttackStart(victim);
10410 return true;
10411 }
10412 }
10414 {
10416 SendMeleeAttackStop(victim);
10417 return true;
10418 }
10419 return false;
10420 }
10421
10422 // switch target
10423 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10424 if (!meleeAttack)
10426 }
10427
10428 if (m_attacking)
10430
10431 m_attacking = victim;
10433
10434 // Set our target
10435 SetTarget(victim->GetGUID());
10436
10437 if (meleeAttack)
10439
10440 Unit* owner = GetCharmerOrOwner();
10441 Creature* ownerCreature = owner ? owner->ToCreature() : nullptr;
10442 Creature* controlledCreatureWithSameVictim = nullptr;
10443 if (creature && !m_Controlled.empty())
10444 {
10445 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10446 {
10447 if ((*itr)->ToCreature() && (*itr)->GetVictim() == victim)
10448 {
10449 controlledCreatureWithSameVictim = (*itr)->ToCreature();
10450 break;
10451 }
10452 }
10453 }
10454
10455 // Share leash timer with controlled unit
10456 if (controlledCreatureWithSameVictim)
10457 creature->SetLastLeashExtensionTimePtr(controlledCreatureWithSameVictim->GetLastLeashExtensionTimePtr());
10458 // Share leash timer with owner
10459 else if (creature && ownerCreature && ownerCreature->GetVictim() == victim)
10461 // Update leash timer when attacking creatures
10462 else if (victim->IsCreature())
10464
10465 // set position before any AI calls/assistance
10466 //if (IsCreature())
10467 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10468 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10469 {
10470 // should not let player enter combat by right clicking target - doesn't helps
10471 SetInCombatWith(victim);
10472 if (victim->IsPlayer())
10473 victim->SetInCombatWith(this);
10474
10475 AddThreat(victim, 0.0f);
10476
10478
10481 creature->CallAssistance();
10482
10484
10486 }
10487
10488 // delay offhand weapon attack by 50% of the base attack time
10491
10492 if (meleeAttack)
10493 SendMeleeAttackStart(victim);
10494
10495 return true;
10496}
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition CreatureData.h:70
@ EMOTE_ONESHOT_NONE
Definition SharedDefines.h:1905
@ AI_REACTION_HOSTILE
Definition SharedDefines.h:3492
@ SPELL_AURA_MOD_UNATTACKABLE
Definition SpellAuraDefines.h:156
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
@ CURRENT_MELEE_SPELL
Definition Unit.h:538
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
T CalculatePct(T base, U pct)
Definition Util.h:61
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition WorldConfig.h:235
void CallAssistance(Unit *target=nullptr)
Definition Creature.cpp:2435
bool IsEvadingAttacks() const
Definition Creature.h:136
std::shared_ptr< time_t > const & GetLastLeashExtensionTimePtr() const
Definition Creature.cpp:3704
void UpdateLeashExtensionTime()
Definition Creature.cpp:3726
void SetAssistanceTimer(uint32 value)
Definition Creature.h:408
void SetLastLeashExtensionTimePtr(std::shared_ptr< time_t > const &timer)
Definition Creature.cpp:3711
void SendAIReaction(AiReaction reactionType)
Definition Creature.cpp:2423
bool IsInEvadeMode() const
Definition Creature.h:135
float GetFloatValue(uint16 index) const
Definition Object.cpp:306
bool IsGameMaster() const
Definition Player.h:1166
bool HasOffhandWeaponForAttack() const
Definition Unit.h:929
void ClearUnitState(uint32 f)
Definition Unit.h:692
bool IsPolymorphed() const
Definition Unit.cpp:16828
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition Unit.cpp:14758
void _removeAttacker(Unit *pAttacker)
Definition Unit.h:2145
void _addAttacker(Unit *pAttacker)
Definition Unit.h:2144
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition Unit.cpp:13679
bool HasUnattackableAura() const
Definition Unit.h:1747
Unit * GetCharmerOrOwner() const
Definition Unit.h:1213
bool IsMounted() const
Definition Unit.h:1800
Unit * GetVictim() const
Definition Unit.h:848
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3090
bool IsControllableGuardian() const
Definition Unit.h:746
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21186
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition Unit.cpp:3106
bool IsControlledByPlayer() const
Definition Unit.h:1234
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1718
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0
bool InSamePhase(WorldObject const *obj) const
Definition Object.h:514
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1290
#define sWorld
Definition World.h:317

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, getAttackTimer(), GetCharmerOrOwner(), Object::GetFloatValue(), Object::GetGUID(), Creature::GetLastLeashExtensionTimePtr(), GetVictim(), Creature::HasFlagsExtra(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, m_Controlled, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), Creature::SetLastLeashExtensionTimePtr(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, UNIT_STATE_MELEE_ATTACKING, and Creature::UpdateLeashExtensionTime().

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2593{
2595 {
2596 return;
2597 }
2598
2599 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2600 {
2601 return;
2602 }
2603
2604 if (!victim->IsAlive())
2605 return;
2606
2607 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2608 return;
2609
2610 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2611 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2612
2613 CombatStart(victim);
2615
2616 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2617 return; // ignore ranged case
2618
2619 if (!extra && _lastExtraAttackSpell)
2620 {
2622 }
2623
2624 bool meleeAttack = true;
2625
2626 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2627 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2628 {
2629 meleeAttack = false; // The melee attack is replaced by the melee spell
2630
2632 SpellCastResult castResult = meleeSpell->CheckCast(false);
2633 if (castResult != SPELL_CAST_OK)
2634 {
2635 meleeSpell->SendCastResult(castResult);
2636 meleeSpell->SendInterrupted(0);
2637
2638 meleeSpell->finish(false);
2639 meleeSpell->SetExecutedCurrently(false);
2640
2641 if (castResult == SPELL_FAILED_NO_POWER)
2642 {
2643 // Not enough rage, do a regular melee attack instead
2644 meleeAttack = true;
2645 }
2646 }
2647 else
2648 {
2649 meleeSpell->cast(true);
2650 }
2651 }
2652 if (meleeAttack)
2653 {
2654 // attack can be redirected to another target
2655 victim = GetMeleeHitRedirectTarget(victim);
2656 CalcDamageInfo damageInfo;
2657 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2658
2659 // Send log damage message to client
2660 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2661 {
2662 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2663 }
2664
2665 // Related to sparring system. Allow attack animations even if there are no damages
2666 if (victim->CanSparringWith(damageInfo.attacker))
2667 damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
2668
2669 SendAttackStateUpdate(&damageInfo);
2670
2671 //TriggerAurasProcOnEvent(damageInfo);
2672
2673 _lastDamagedTargetGuid = victim->GetGUID();
2674
2675 DealMeleeDamage(&damageInfo, true);
2676
2677 DamageInfo dmgInfo(damageInfo);
2678 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2679 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2680
2681 if (IsPlayer())
2682 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2683 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2684 else
2685 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2686 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2687
2688 // Let the pet know we've started attacking someting. Handles melee attacks only
2689 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2690 if (IsPlayer() && !m_Controlled.empty())
2691 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2692 if (Unit* pet = *itr)
2693 if (pet->IsAlive() && pet->IsCreature())
2694 pet->ToCreature()->AI()->OwnerAttacked(victim);
2695 }
2696}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ SPELL_FAILED_NO_POWER
Definition SharedDefines.h:1045
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition SpellDefines.h:55
@ UNIT_STAND_STATE_SLEEP
Definition UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition UnitDefines.h:214
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:267
@ HITINFO_FAKE_DAMAGE
Definition Unit.h:122
Definition Unit.h:331
std::string ToString() const
Definition ObjectGuid.cpp:47
void cast(bool skipCheck=false)
Definition Spell.cpp:3789
void SetExecutedCurrently(bool yes)
Definition Spell.h:572
void SendInterrupted(uint8 result)
Definition Spell.cpp:5191
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4686
void finish(bool ok=true)
Definition Spell.cpp:4494
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition Unit.cpp:6579
void CombatStart(Unit *target, bool initialAggro=true)
Definition Unit.cpp:13724
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition Unit.cpp:11156
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition Unit.cpp:1491
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:6478
uint8 getStandState() const
Definition Unit.h:1695
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition Unit.cpp:1856
bool CanSparringWith(Unit const *attacker) const
Definition Unit.cpp:3987
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:815
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition Object.cpp:1352
Definition Unit.h:464
uint32 procAttacker
Definition Unit.h:481
uint32 procVictim
Definition Unit.h:482
uint32 absorb
Definition Unit.h:472
struct CalcDamageInfo::@265 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 damage
Definition Unit.h:471
uint32 procEx
Definition Unit.h:483
uint32 HitInfo
Definition Unit.h:477
Unit * attacker
Definition Unit.h:465
Unit * target
Definition Unit.h:466
WeaponAttackType attackType
Definition Unit.h:480
std::string ToString() const
Definition Position.cpp:52

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), CanSparringWith(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_FAKE_DAMAGE, IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10503{
10504 if (!m_attacking)
10505 return false;
10506
10507 Unit* victim = m_attacking;
10508
10510 m_attacking = nullptr;
10511
10512 // Clear our target
10514
10516
10518
10519 // reset only at real combat stop
10520 if (Creature* creature = ToCreature())
10521 {
10522 creature->SetNoCallAssistance(false);
10523
10524 if (creature->HasSearchedAssistance())
10525 {
10526 creature->SetNoSearchAssistance(false);
10527 }
10528 }
10529
10530 SendMeleeAttackStop(victim);
10531
10532 return true;
10533}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), advisor_baseAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), spell_q11065_wrangle_some_aether_rays_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_felmyst::ScheduleGroundAbilities(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_attumen::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10636{
10638 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10639 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10640 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10641 auraStates |= (1 << (itr->first - 1));
10642
10643 return auraStates;
10644}
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
20859{
20860 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
20861 data << GetGUID();
20862 data << uint8(flags);
20863 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
20864 {
20865 data << uint32(itr->first);
20866 data << uint32(itr->second);
20867 }
20868}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_SPELL_COOLDOWN
Definition Opcodes.h:338

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2059{
2060 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2061 *data << GetPackGUID();
2062 BuildMovementPacket(data);
2063}
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19734
@ MSG_MOVE_HEARTBEAT
Definition Opcodes.h:268

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by boss_volkhan::boss_volkhanAI::MovementInform(), and SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19735{
19736 *data << uint32(GetUnitMovementFlags()); // movement flags
19737 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19738 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19739 *data << GetPositionX();
19740 *data << GetPositionY();
19741 *data << GetPositionZ();
19742 *data << GetOrientation();
19743
19744 // 0x00000200
19746 {
19747 if (m_vehicle)
19748 *data << m_vehicle->GetBase()->GetPackGUID();
19749 else if (GetTransport())
19750 *data << GetTransport()->GetPackGUID();
19751 else
19752 *data << (uint8)0;
19753
19754 *data << float (GetTransOffsetX());
19755 *data << float (GetTransOffsetY());
19756 *data << float (GetTransOffsetZ());
19757 *data << float (GetTransOffsetO());
19758 *data << uint32(GetTransTime());
19759 *data << uint8 (GetTransSeat());
19760
19763 }
19764
19765 // 0x02200000
19768 *data << (float)m_movementInfo.pitch;
19769
19770 *data << (uint32)m_movementInfo.fallTime;
19771
19772 // 0x00001000
19774 {
19775 *data << (float)m_movementInfo.jump.zspeed;
19776 *data << (float)m_movementInfo.jump.sinAngle;
19777 *data << (float)m_movementInfo.jump.cosAngle;
19778 *data << (float)m_movementInfo.jump.xyspeed;
19779 }
19780
19781 // 0x04000000
19783 *data << (float)m_movementInfo.splineElevation;
19784}
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:374
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:390
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:377
@ MOVEMENTFLAG_SWIMMING
Definition UnitDefines.h:386
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition UnitDefines.h:391
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition UnitDefines.h:426
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition UnitDefines.h:431
uint32 GetUnitMovementFlags() const
Definition Unit.h:730
uint16 GetExtraUnitMovementFlags() const
Definition Unit.h:736
float GetTransOffsetX() const
Definition Object.h:684
float GetTransOffsetY() const
Definition Object.h:685
float GetTransOffsetZ() const
Definition Object.h:686
uint32 GetTransTime() const
Definition Object.h:688
Transport * GetTransport() const
Definition Object.h:683
float GetTransOffsetO() const
Definition Object.h:687
float cosAngle
Definition Object.h:329
float xyspeed
Definition Object.h:329
float zspeed
Definition Object.h:329
float sinAngle
Definition Object.h:329
uint32 time2
Definition Object.h:312
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition Object.h:319
struct MovementInfo::TransportInfo transport
float splineElevation
Definition Object.h:333
float pitch
Definition Object.h:316

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), SendTeleportPacket(), Player::SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), Player::SetDisableGravity(), Player::SetFeatherFall(), Creature::SetFeatherFall(), Player::SetHover(), SetSpeed(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20575{
20576 if (!target)
20577 return;
20578
20580 uint32 visibleFlag = UF_FLAG_PUBLIC;
20581
20582 if (target == this)
20583 visibleFlag |= UF_FLAG_PRIVATE;
20584
20586 if (GetOwnerGUID() == target->GetGUID())
20587 visibleFlag |= UF_FLAG_OWNER;
20588
20591 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20592
20593 if (plr && plr->IsInSameRaidWith(target))
20594 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20595
20596 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20597
20598 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20599 if (cacheIt != _valuesUpdateCache.end())
20600 {
20601 int32 cachePos = static_cast<int32>(data->wpos());
20602 data->append(cacheIt->second.buffer);
20603
20604 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20605 if (cachePos)
20606 dataAdjustedPos.ApplyOffset(cachePos);
20607
20608 PatchValuesUpdate(*data, dataAdjustedPos, target);
20609
20610 return;
20611 }
20612
20613 BuildValuesCachedBuffer cacheValue(500);
20614
20615 ByteBuffer fieldBuffer(400);
20616
20617 UpdateMask updateMask;
20618 updateMask.SetCount(m_valuesCount);
20619
20620 for (uint16 index = 0; index < m_valuesCount; ++index)
20621 {
20622 if (_fieldNotifyFlags & flags[index] ||
20623 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20624 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20626 {
20627 updateMask.SetBit(index);
20628
20629 if (index == UNIT_NPC_FLAGS)
20630 {
20631 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20632 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20633 }
20634 else if (index == UNIT_FIELD_AURASTATE)
20635 {
20636 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20637 fieldBuffer << uint32(0); // Fill in later.
20638 }
20639 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20640 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20641 {
20642 // convert from float to uint32 and send
20643 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20644 }
20645 // there are some float values which may be negative or can't get negative due to other checks
20646 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20649 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20650 {
20651 fieldBuffer << uint32(m_floatValues[index]);
20652 }
20653 // Gamemasters should be always able to select units - remove not selectable flag
20654 else if (index == UNIT_FIELD_FLAGS)
20655 {
20656 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20657 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20658 }
20659 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20660 else if (index == UNIT_FIELD_DISPLAYID)
20661 {
20662 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20663 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20664 }
20665 else if (index == UNIT_DYNAMIC_FLAGS)
20666 {
20667 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20669 fieldBuffer << dynamicFlags;
20670 }
20671 else if (index == UNIT_FIELD_BYTES_2)
20672 {
20673 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20674 fieldBuffer << m_uint32Values[index];
20675 }
20676 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20677 {
20678 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20679 fieldBuffer << m_uint32Values[index];
20680 }
20681 else
20682 {
20683 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20684 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20685
20686 // send in current format (float as float, uint32 as uint32)
20687 fieldBuffer << m_uint32Values[index];
20688 }
20689 }
20690 }
20691
20692 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20693 updateMask.AppendToPacket(&cacheValue.buffer);
20694 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20695 cacheValue.buffer.append(fieldBuffer);
20696 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20697
20698 int32 cachePos = static_cast<int32>(data->wpos());
20699 data->append(cacheValue.buffer);
20700
20701 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20702 if (cachePos)
20703 dataAdjustedPos.ApplyOffset(cachePos);
20704
20705 PatchValuesUpdate(*data, dataAdjustedPos, target);
20706
20707 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20708}
std::uint64_t uint64
Definition Define.h:106
@ UNIT_DYNFLAG_SPECIALINFO
Definition SharedDefines.h:3375
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition SharedDefines.h:3374
@ UNIT_DYNFLAG_TAPPED
Definition SharedDefines.h:3373
@ SPELL_AURA_EMPATHY
Definition SpellAuraDefines.h:184
@ UPDATETYPE_VALUES
Definition UpdateData.h:28
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition UpdateFieldFlags.cpp:162
@ UF_FLAG_SPECIAL_INFO
Definition UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition UpdateFieldFlags.h:33
@ UNIT_NPC_FLAGS
Definition UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition UpdateFields.h:136
Definition ByteBuffer.h:70
void append(T value)
Definition ByteBuffer.h:129
std::size_t wpos() const
Definition ByteBuffer.h:330
uint16 _fieldNotifyFlags
Definition Object.h:268
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:123
UpdateMask _changesMask
Definition Object.h:264
uint32 * m_uint32Values
Definition Object.h:260
uint16 m_valuesCount
Definition Object.h:266
float * m_floatValues
Definition Object.h:261
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1888
ValuesUpdateCache _valuesUpdateCache
Definition Unit.h:2176
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Unit.cpp:10715
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition Unit.cpp:5802
ObjectGuid GetOwnerGUID() const
Definition Unit.h:668
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition Unit.cpp:20710
Definition UpdateMask.h:25
uint32 GetBlockCount() const
Definition UpdateMask.h:62
bool GetBit(uint32 index) const
Definition UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition UpdateMask.h:65
void SetBit(uint32 index)
Definition UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition UpdateMask.h:49
Definition UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition UnitUtils.h:70
Definition UnitUtils.h:110

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2175{
2176 Unit* victim = dmgInfo.GetVictim();
2177 Unit* attacker = dmgInfo.GetAttacker();
2178 uint32 damage = dmgInfo.GetDamage();
2179 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2180 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2181
2182 if (!victim || !victim->IsAlive() || !damage)
2183 return;
2184
2185 // Magic damage, check for resists
2186 // Ignore spells that cant be resisted
2187 // Xinef: holy resistance exists for npcs
2188 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2189 {
2190 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2191
2192 float discreteResistProbability[11];
2193 for (uint32 i = 0; i < 11; ++i)
2194 {
2195 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2196 if (discreteResistProbability[i] < 0.0f)
2197 discreteResistProbability[i] = 0.0f;
2198 }
2199
2200 if (averageResist <= 0.1f)
2201 {
2202 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2203 discreteResistProbability[1] = 5.0f * averageResist;
2204 discreteResistProbability[2] = 2.5f * averageResist;
2205 }
2206
2207 float r = float(rand_norm());
2208 uint32 i = 0;
2209 float probabilitySum = discreteResistProbability[0];
2210
2211 while (r >= probabilitySum && i < 10)
2212 probabilitySum += discreteResistProbability[++i];
2213
2214 float damageResisted = float(damage * i / 10);
2215
2216 if (damageResisted) // if equal to 0, checking these is pointless
2217 {
2218 if (attacker)
2219 {
2221 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2222 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2223 AddPct(damageResisted, -(*j)->GetAmount());
2224
2226 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2227 if ((*j)->GetMiscValue() & schoolMask)
2228 AddPct(damageResisted, -(*j)->GetAmount());
2229 }
2230
2231 // pussywizard:
2232 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2233 {
2234 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2235 uint32 armorReduction = damage - damageAfterArmor;
2236 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2237 damageResisted = armorReduction;
2238 }
2239 }
2240
2241 dmgInfo.ResistDamage(uint32(damageResisted));
2242 }
2243
2244 // Ignore Absorption Auras
2245 float auraAbsorbMod = 0;
2246 if (attacker)
2247 {
2249 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2250 {
2251 if (!((*itr)->GetMiscValue() & schoolMask))
2252 continue;
2253
2254 if ((*itr)->GetAmount() > auraAbsorbMod)
2255 auraAbsorbMod = float((*itr)->GetAmount());
2256 }
2257
2259 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2260 {
2261 if (!((*itr)->GetMiscValue() & schoolMask))
2262 continue;
2263
2264 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2265 auraAbsorbMod = float((*itr)->GetAmount());
2266 }
2267 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2268 }
2269
2270 // We're going to call functions which can modify content of the list during iteration over it's elements
2271 // Let's copy the list so we can prevent iterator invalidation
2273 std::sort(vSchoolAbsorbCopy.begin(), vSchoolAbsorbCopy.end(), Acore::AbsorbAuraOrderPred());
2274
2275 // absorb without mana cost
2276 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2277 {
2278 AuraEffect* absorbAurEff = *itr;
2279 // Check if aura was removed during iteration - we don't need to work on such auras
2280 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2281 if (!aurApp)
2282 continue;
2283 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2284 continue;
2285
2286 // get amount which can be still absorbed by the aura
2287 int32 currentAbsorb = absorbAurEff->GetAmount();
2288 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2289 if (currentAbsorb < 0)
2290 currentAbsorb = 0;
2291
2292 uint32 tempAbsorb = uint32(currentAbsorb);
2293
2294 bool defaultPrevented = false;
2295
2296 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2297 currentAbsorb = tempAbsorb;
2298
2299 if (defaultPrevented)
2300 continue;
2301
2302 // absorb must be smaller than the damage itself
2303 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2304
2305 // xinef: do this after absorb is rounded to damage...
2306 AddPct(currentAbsorb, -auraAbsorbMod);
2307
2308 dmgInfo.AbsorbDamage(currentAbsorb);
2309
2310 tempAbsorb = currentAbsorb;
2311 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2312
2313 // Check if our aura is using amount to count damage
2314 if (absorbAurEff->GetAmount() >= 0)
2315 {
2316 // Reduce shield amount
2317 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2318 // Aura cannot absorb anything more - remove it
2319 if (absorbAurEff->GetAmount() <= 0)
2320 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2321 }
2322 }
2323
2324 // absorb by mana cost
2326 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2327 {
2328 AuraEffect* absorbAurEff = *itr;
2329 // Check if aura was removed during iteration - we don't need to work on such auras
2330 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2331 if (!aurApp)
2332 continue;
2333 // check damage school mask
2334 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2335 continue;
2336
2337 // get amount which can be still absorbed by the aura
2338 int32 currentAbsorb = absorbAurEff->GetAmount();
2339 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2340 if (currentAbsorb < 0)
2341 currentAbsorb = 0;
2342
2343 uint32 tempAbsorb = currentAbsorb;
2344
2345 bool defaultPrevented = false;
2346
2347 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2348 currentAbsorb = tempAbsorb;
2349
2350 if (defaultPrevented)
2351 continue;
2352
2353 // absorb must be smaller than the damage itself
2354 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2355
2356 // xinef: do this after absorb is rounded to damage...
2357 AddPct(currentAbsorb, -auraAbsorbMod);
2358
2359 int32 manaReduction = currentAbsorb;
2360
2361 // lower absorb amount by talents
2362 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2363 manaReduction = int32(float(manaReduction) * manaMultiplier);
2364
2365 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2366
2367 // take case when mana has ended up into account
2368 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2369
2370 dmgInfo.AbsorbDamage(currentAbsorb);
2371
2372 tempAbsorb = currentAbsorb;
2373 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2374
2375 // Check if our aura is using amount to count damage
2376 if (absorbAurEff->GetAmount() >= 0)
2377 {
2378 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2379 if ((absorbAurEff->GetAmount() <= 0))
2380 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2381 }
2382 }
2383
2384 // split damage auras - only when not damaging self
2385 // Xinef: not true - Warlock Hellfire
2386 if (/*victim != attacker &&*/ !Splited)
2387 {
2388 // We're going to call functions which can modify content of the list during iteration over it's elements
2389 // Let's copy the list so we can prevent iterator invalidation
2390 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2391 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2392 {
2393 // Check if aura was removed during iteration - we don't need to work on such auras
2394 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2395 continue;
2396 // check damage school mask
2397 if (!((*itr)->GetMiscValue() & schoolMask))
2398 continue;
2399
2400 // Damage can be splitted only if aura has an alive caster
2401 Unit* caster = (*itr)->GetCaster();
2402 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2403 continue;
2404
2405 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2406 // Ignore LOS attribute is only used for the cast portion of the spell
2407 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2408 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2409 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2410 continue;
2411
2412 int32 splitDamage = (*itr)->GetAmount();
2413
2414 // absorb must be smaller than the damage itself
2415 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2416
2417 dmgInfo.AbsorbDamage(splitDamage);
2418
2419 uint32 splitted = splitDamage;
2420 uint32 splitted_absorb = 0;
2421 uint32 splitted_resist = 0;
2422
2423 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2424 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2425 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2426 {
2427 procEx |= PROC_EX_IMMUNE;
2428 splittedDmgInfo.AbsorbDamage(splitted);
2429 }
2430 else
2431 {
2432 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2433 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2434 }
2435
2436 splitted_absorb = splittedDmgInfo.GetAbsorb();
2437 splitted_resist = splittedDmgInfo.GetResist();
2438 splitted = splittedDmgInfo.GetDamage();
2439
2440 // create procs
2441 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2442 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2443
2444 if (attacker)
2445 {
2446 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2447 }
2448
2449 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2450 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2451 }
2452
2453 // We're going to call functions which can modify content of the list during iteration over it's elements
2454 // Let's copy the list so we can prevent iterator invalidation
2456 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(); (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2457 {
2458 // Check if aura was removed during iteration - we don't need to work on such auras
2459 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2460 if (!aurApp)
2461 continue;
2462
2463 // check damage school mask
2464 if (!((*itr)->GetMiscValue() & schoolMask))
2465 continue;
2466
2467 // Damage can be splitted only if aura has an alive caster
2468 Unit* caster = (*itr)->GetCaster();
2469 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2470 continue;
2471
2472 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2473 // Ignore LOS attribute is only used for the cast portion of the spell
2474 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2475 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2476 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2477 continue;
2478
2479 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2480 SpellSchoolMask splitSchoolMask = schoolMask;
2481
2482 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2483
2484 // absorb must be smaller than the damage itself
2485 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2486
2487 // Roar of Sacrifice, dont absorb it
2488 if (splitSpellInfo->Id != 53480)
2489 dmgInfo.AbsorbDamage(splitDamage);
2490 else
2491 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2492
2493 uint32 splitted = splitDamage;
2494 uint32 splitted_absorb = 0;
2495 uint32 splitted_resist = 0;
2496
2497 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2498 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2499 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2500 {
2501 procEx |= PROC_EX_IMMUNE;
2502 splittedDmgInfo.AbsorbDamage(splitted);
2503 }
2504 else
2505 {
2506 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2507 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2508 }
2509
2510 splitted_absorb = splittedDmgInfo.GetAbsorb();
2511 splitted_resist = splittedDmgInfo.GetResist();
2512 splitted = splittedDmgInfo.GetDamage();
2513
2514 // create procs
2515 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2516 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2517
2518 if (attacker)
2519 {
2520 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2521 }
2522
2523 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2524 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2525 }
2526 }
2527}
double rand_norm()
Definition Random.cpp:85
@ POWER_MANA
Definition SharedDefines.h:280
@ SPELL_ATTR4_NO_CAST_LOG
Definition SharedDefines.h:541
SpellSchoolMask
Definition SharedDefines.h:306
@ SPELL_SCHOOL_MASK_NORMAL
Definition SharedDefines.h:308
@ SPELL_SCHOOL_MASK_NATURE
Definition SharedDefines.h:311
@ SPELL_SCHOOL_MASK_HOLY
Definition SharedDefines.h:309
@ SPELL_AURA_MANA_SHIELD
Definition SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition SpellAuraDefines.h:394
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition SpellMgr.h:202
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition Unit.cpp:16011
@ DIRECT_DAMAGE
Definition Unit.h:249
@ MELEE_HIT_NORMAL
Definition Unit.h:287
T AddPct(T &base, U pct)
Definition Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition Util.h:79
Definition SpellAuraEffects.h:350
Definition SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition SpellAuraEffects.h:66
Unit * GetCaster() const
Definition SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition SpellAuraEffects.cpp:443
Aura * GetBase() const
Definition SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
void ResistDamage(uint32 amount)
Definition Unit.cpp:160
void AbsorbDamage(uint32 amount)
Definition Unit.cpp:153
Unit * GetVictim() const
Definition Unit.h:360
Unit * GetAttacker() const
Definition Unit.h:359
SpellInfo const * GetSpellInfo() const
Definition Unit.h:361
DamageEffectType GetDamageType() const
Definition Unit.h:363
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:362
uint32 GetDamage() const
Definition Unit.h:365
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2335
bool IsPositive() const
Definition SpellInfo.cpp:1237
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:14254
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1351
std::vector< AuraEffect * > AuraEffectList
Definition Unit.h:636
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition Unit.cpp:2058
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition Unit.cpp:2140
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition Unit.cpp:6410
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:16145
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12999
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2174
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition Unit.cpp:825
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1321
Definition Unit.h:316

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2059{
2060 float armor = float(victim->GetArmor());
2061
2062 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2063 if (attacker)
2064 {
2065 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2066
2067 if (spellInfo)
2068 if (Player* modOwner = attacker->GetSpellModOwner())
2069 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2070
2071 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2072 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2073 {
2074 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2075 && (*j)->IsAffectedOnSpell(spellInfo))
2076 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2077 }
2078
2079 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2080 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2081 {
2082 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2083 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2084 }
2085
2086 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2087 if (attacker->IsPlayer())
2088 {
2089 float bonusPct = 0;
2090 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2091 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2092 {
2093 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2094 {
2095 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2096 bonusPct += (*itr)->GetAmount();
2097 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2098 bonusPct += (*itr)->GetAmount();
2099 }
2100 else
2101 {
2102 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2103 bonusPct += (*itr)->GetAmount();
2104 }
2105 }
2106
2107 float maxArmorPen = 0;
2108 if (victim->GetLevel() < 60)
2109 maxArmorPen = float(400 + 85 * victim->GetLevel());
2110 else
2111 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2112
2113 // Cap armor penetration to this number
2114 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2115 // Figure out how much armor do we ignore
2116 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2117 // Got the value, apply it
2118 armor -= std::min(armorPen, maxArmorPen);
2119 }
2120 }
2121
2122 if (armor < 0.0f)
2123 armor = 0.0f;
2124
2125 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2126 if (levelModifier > 59)
2127 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2128
2129 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2130 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2131
2132 if (tmpvalue < 0.0f)
2133 tmpvalue = 0.0f;
2134 if (tmpvalue > 0.75f)
2135 tmpvalue = 0.75f;
2136
2137 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2138}
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition SpellDefines.h:89
@ CR_ARMOR_PENETRATION
Definition Unit.h:242

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2530{
2531 if (!healInfo.GetHeal())
2532 return;
2533
2534 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2535 int32 absorbAmount = 0;
2536
2537 // Need remove expired auras after
2538 bool existExpired = false;
2539
2540 // absorb without mana cost
2542 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2543 {
2544 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2545 continue;
2546
2547 // Max Amount can be absorbed by this aura
2548 int32 currentAbsorb = (*i)->GetAmount();
2549
2550 // Found empty aura (impossible but..)
2551 if (currentAbsorb <= 0)
2552 {
2553 existExpired = true;
2554 continue;
2555 }
2556
2557 // currentAbsorb - damage can be absorbed by shield
2558 // If need absorb less damage
2559 if (healing < currentAbsorb + absorbAmount)
2560 currentAbsorb = healing - absorbAmount;
2561
2562 absorbAmount += currentAbsorb;
2563
2564 // Reduce shield amount
2565 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2566 // Need remove it later
2567 if ((*i)->GetAmount() <= 0)
2568 existExpired = true;
2569 }
2570
2571 // Remove all expired absorb auras
2572 if (existExpired)
2573 {
2574 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2575 {
2576 AuraEffect* auraEff = *i;
2577 ++i;
2578 if (auraEff->GetAmount() <= 0)
2579 {
2580 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2582 if (healInfo.GetTarget()->m_removedAurasCount > removedAuras)
2583 i = vHealAbsorb.begin();
2584 }
2585 }
2586 }
2587
2588 if (absorbAmount > 0)
2589 healInfo.AbsorbHeal(absorbAmount);
2590}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition Unit.h:416
void AbsorbHeal(uint32 amount)
Definition Unit.h:391
Unit * GetTarget() const
Definition Unit.h:412
uint32 GetHeal() const
Definition Unit.h:413
uint32 SchoolMask
Definition SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14962{
14963 uint8 comboPoints = GetComboPoints();
14964
14965 int32 minduration = spellProto->GetDuration();
14966 int32 maxduration = spellProto->GetMaxDuration();
14967
14968 int32 duration;
14969
14970 if (comboPoints && minduration != -1 && minduration != maxduration)
14971 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14972 else
14973 duration = minduration;
14974
14975 return duration;
14976}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition Unit.h:953

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
bool  npcCaster 
) const
20247{
20248 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20249 if (npcCaster)
20251
20252 return damage;
20253}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6074

References GetTotalAuraMultiplierByMiscMask(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
3014{
3015 float minDamage = 0.0f;
3016 float maxDamage = 0.0f;
3017
3018 if (normalized || !addTotalPct || itemDamagesMask)
3019 {
3020 // get both by default
3021 if (!itemDamagesMask)
3022 {
3023 itemDamagesMask = (1 << 0) | (1 << 1);
3024 }
3025
3026 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3027 {
3028 if (itemDamagesMask & (1 << i))
3029 {
3030 float minTmp, maxTmp;
3031 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3032 minDamage += minTmp;
3033 maxDamage += maxTmp;
3034 }
3035 }
3036 }
3037 else
3038 {
3039 switch (attType)
3040 {
3041 case RANGED_ATTACK:
3044 break;
3045 case BASE_ATTACK:
3048 break;
3049 case OFF_ATTACK:
3052 break;
3053 default:
3054 break;
3055 }
3056 }
3057
3058 minDamage = std::max(0.f, minDamage);
3059 maxDamage = std::max(0.f, maxDamage);
3060
3061 if (minDamage > maxDamage)
3062 {
3063 std::swap(minDamage, maxDamage);
3064 }
3065
3066 return urand(uint32(minDamage), uint32(maxDamage));
3067}
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition UpdateFields.h:129
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17284{
17285 // Damage over Time spells bonus calculation
17286 float DotFactor = 1.0f;
17287 if (damagetype == DOT)
17288 {
17289 int32 DotDuration = spellInfo->GetDuration();
17290 if (!spellInfo->IsChanneled() && DotDuration > 0)
17291 DotFactor = DotDuration / 15000.0f;
17292
17293 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17294 DotFactor /= DotTicks;
17295 }
17296
17297 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17298 // Distribute Damage over multiple effects, reduce by AoE
17299 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17300
17301 // As wowwiki says: C = (Cast Time / 3.5)
17302 return (CastingTime / 3500.0f) * DotFactor;
17303}
@ DOT
Definition Unit.h:251
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition Unit.cpp:17165

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken(), and SpellHealingBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3070{
3071 if (!IsPlayer())
3072 return 1.0f;
3073
3074 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3075 return 1.0f;
3076
3077 float LvlPenalty = 0.0f;
3078
3079 // xinef: added brackets
3080 if (spellProto->SpellLevel < 20)
3081 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3082
3083 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3084 if (LvlFactor > 1.0f)
3085 LvlFactor = 1.0f;
3086
3087 return AddPct(LvlFactor, -LvlPenalty);
3088}
uint8 GetLevel() const
Definition Unit.h:1026

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), and SpellHealingBonusTaken().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1492{
1493 damageInfo->attacker = this;
1494 damageInfo->target = victim;
1495
1496 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1497 {
1498 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1499 damageInfo->damages[i].damage = 0;
1500 damageInfo->damages[i].absorb = 0;
1501 damageInfo->damages[i].resist = 0;
1502 }
1503
1504 damageInfo->attackType = attackType;
1505 damageInfo->cleanDamage = 0;
1506 damageInfo->blocked_amount = 0;
1507
1508 damageInfo->TargetState = 0;
1509 damageInfo->HitInfo = 0;
1510 damageInfo->procAttacker = PROC_FLAG_NONE;
1511 damageInfo->procVictim = PROC_FLAG_NONE;
1512 damageInfo->procEx = PROC_EX_NONE;
1513 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1514
1515 if (!victim)
1516 return;
1517
1518 if (!IsAlive() || !victim->IsAlive())
1519 return;
1520
1521 // Select HitInfo/procAttacker/procVictim flag based on attack type
1522 switch (attackType)
1523 {
1524 case BASE_ATTACK:
1527 break;
1528 case OFF_ATTACK:
1531 damageInfo->HitInfo = HITINFO_OFFHAND;
1532 break;
1533 default:
1534 return;
1535 }
1536
1537 // School Immune check
1538 uint8 immunedMask = 0;
1539 bool hasNonPhysicalSchoolMask = false;
1540 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1541 {
1543 {
1544 immunedMask |= (1 << i);
1546 {
1547 hasNonPhysicalSchoolMask = true;
1548 }
1549 }
1550 }
1551
1552 // School Immune check
1553 if (immunedMask & ((1 << 0) | (1 << 1)))
1554 {
1555 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1556 {
1557 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1558 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1559
1560 damageInfo->procEx |= PROC_EX_IMMUNE;
1561 return;
1562 }
1563 }
1564
1565 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1566 {
1567 // only players have secondary weapon damage
1568 if (i > 0 && !IsPlayer())
1569 {
1570 break;
1571 }
1572
1573 if (immunedMask & (1 << i))
1574 {
1575 continue;
1576 }
1577
1578 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1579 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1580
1581 uint32 damage = 0;
1582 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1583
1584 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1585 // Add melee damage bonus
1586 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1587 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1588
1589 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1590 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1591
1592 if (victim->GetAI())
1593 {
1594 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1595 }
1596
1597 // Calculate armor reduction
1599 {
1600 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1601 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1602 }
1603 else
1604 {
1605 damageInfo->damages[i].damage = damage;
1606 }
1607 }
1608
1609 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1610
1611 // If the victim was a sitting player and we didn't roll a miss, then crit.
1612 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1613 {
1614 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1615 }
1616 switch (damageInfo->hitOutCome)
1617 {
1618 case MELEE_HIT_EVADE:
1620 damageInfo->TargetState = VICTIMSTATE_EVADES;
1621 damageInfo->procEx |= PROC_EX_EVADE;
1622
1623 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1624 {
1625 damageInfo->damages[i].damage = 0;
1626 }
1627
1628 damageInfo->cleanDamage = 0;
1629 return;
1630 case MELEE_HIT_MISS:
1631 damageInfo->HitInfo |= HITINFO_MISS;
1632 damageInfo->TargetState = VICTIMSTATE_INTACT;
1633 damageInfo->procEx |= PROC_EX_MISS;
1634
1635 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1636 {
1637 damageInfo->damages[i].damage = 0;
1638 }
1639 damageInfo->cleanDamage = 0;
1640 break;
1641 case MELEE_HIT_NORMAL:
1642 damageInfo->TargetState = VICTIMSTATE_HIT;
1643 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1644 break;
1645 case MELEE_HIT_CRIT:
1646 {
1647 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1648 damageInfo->TargetState = VICTIMSTATE_HIT;
1649
1650 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1651 // Crit bonus calc
1652 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1653 {
1654 damageInfo->damages[i].damage *= 2;
1655
1656 float mod = 0.0f;
1657 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1658 if (damageInfo->attackType == RANGED_ATTACK)
1659 {
1661 }
1662 else
1663 {
1665
1666 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1668 }
1669
1670 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1671
1672 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1674 if (mod != 0)
1675 {
1676 AddPct(damageInfo->damages[i].damage, mod);
1677 }
1678 }
1679 break;
1680 }
1681 case MELEE_HIT_PARRY:
1682 damageInfo->TargetState = VICTIMSTATE_PARRY;
1683 damageInfo->procEx |= PROC_EX_PARRY;
1684 damageInfo->cleanDamage = 0;
1685
1686 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1687 {
1688 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1689 damageInfo->damages[i].damage = 0;
1690 }
1691 break;
1692 case MELEE_HIT_DODGE:
1693 damageInfo->TargetState = VICTIMSTATE_DODGE;
1694 damageInfo->procEx |= PROC_EX_DODGE;
1695 damageInfo->cleanDamage = 0;
1696
1697 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1698 {
1699 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1700 damageInfo->damages[i].damage = 0;
1701 }
1702 break;
1703 case MELEE_HIT_BLOCK:
1704 {
1705 damageInfo->TargetState = VICTIMSTATE_HIT;
1706 damageInfo->HitInfo |= HITINFO_BLOCK;
1707 damageInfo->procEx |= PROC_EX_BLOCK;
1708 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1709 // double blocked amount if block is critical
1710 if (damageInfo->target->isBlockCritical())
1711 damageInfo->blocked_amount += damageInfo->blocked_amount;
1712
1713 uint32 remainingBlock = damageInfo->blocked_amount;
1714 uint8 fullBlockMask = 0;
1715 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1716 {
1717 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1718 {
1719 fullBlockMask |= (1 << i);
1720
1721 remainingBlock -= damageInfo->damages[i].damage;
1722 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1723 damageInfo->damages[i].damage = 0;
1724 }
1725 else
1726 {
1727 damageInfo->cleanDamage += remainingBlock;
1728 damageInfo->damages[i].damage -= remainingBlock;
1729 remainingBlock = 0;
1730 }
1731 }
1732
1733 // full block
1734 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1735 {
1736 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1737 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1738 damageInfo->blocked_amount -= remainingBlock;
1739 }
1740 break;
1741 }
1742 case MELEE_HIT_GLANCING:
1743 {
1744 damageInfo->HitInfo |= HITINFO_GLANCING;
1745 damageInfo->TargetState = VICTIMSTATE_HIT;
1746 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1747 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1748 if (leveldif > 3)
1749 leveldif = 3;
1750 float reducePercent = 1 - leveldif * 0.1f;
1751
1752 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1753 {
1754 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1755 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1756 damageInfo->damages[i].damage = reducedDamage;
1757 }
1758 break;
1759 }
1760 case MELEE_HIT_CRUSHING:
1761 damageInfo->HitInfo |= HITINFO_CRUSHING;
1762 damageInfo->TargetState = VICTIMSTATE_HIT;
1763 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1764
1765 // 150% normal damage
1766 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1767 {
1768 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1769 }
1770 break;
1771 default:
1772 break;
1773 }
1774
1775 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1776 if (!(damageInfo->HitInfo & HITINFO_MISS))
1777 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1778
1779 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1780
1781 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1782 {
1783 int32 dmg = damageInfo->damages[i].damage;
1784 int32 cleanDamage = damageInfo->cleanDamage;
1785 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1786 if (CanApplyResilience())
1787 {
1788 int32 resilienceReduction = damageInfo->damages[i].damage;
1789 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1790
1791 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1792 dmg -= resilienceReduction;
1793 cleanDamage += resilienceReduction;
1794 }
1795
1796 damageInfo->damages[i].damage = std::max(0, dmg);
1797 damageInfo->cleanDamage = std::max(0, cleanDamage);
1798
1799 // Calculate absorb resist
1800 if (damageInfo->damages[i].damage > 0)
1801 {
1802 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1803
1804 // Calculate absorb & resists
1805 DamageInfo dmgInfo(*damageInfo, i);
1806 Unit::CalcAbsorbResist(dmgInfo);
1807 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1808 damageInfo->damages[i].resist = dmgInfo.GetResist();
1809
1810 if (damageInfo->damages[i].absorb)
1811 {
1812 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1813 }
1814
1815 if (damageInfo->damages[i].resist)
1816 {
1817 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1818 }
1819
1820 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1821 }
1822 }
1823
1824 // set proper HitInfo flags
1825 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1826 {
1827 // set partial absorb when secondary damage isn't full absorbed
1828 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1829 }
1830 else
1831 {
1832 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1833 }
1834
1835 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1836 {
1837 // set partial resist when secondary damage isn't full resisted
1838 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1839 }
1840 else
1841 {
1842 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1843 }
1844
1846 {
1847 damageInfo->procEx |= PROC_EX_ABSORB;
1848 }
1849
1850 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1851 {
1852 damageInfo->procEx |= PROC_EX_RESIST;
1853 }
1854}
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition SpellMgr.h:193
@ PROC_EX_DODGE
Definition SpellMgr.h:198
@ PROC_EX_BLOCK
Definition SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition SpellMgr.h:195
@ PROC_EX_MISS
Definition SpellMgr.h:196
@ PROC_EX_RESIST
Definition SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition SpellMgr.h:207
@ PROC_EX_ABSORB
Definition SpellMgr.h:204
@ PROC_EX_PARRY
Definition SpellMgr.h:199
@ PROC_EX_EVADE
Definition SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition SpellMgr.h:141
@ PROC_FLAG_NONE
Definition SpellMgr.h:105
@ VICTIMSTATE_INTACT
Definition Unit.h:84
@ VICTIMSTATE_HIT
Definition Unit.h:85
@ VICTIMSTATE_DODGE
Definition Unit.h:86
@ VICTIMSTATE_IS_IMMUNE
Definition Unit.h:91
@ VICTIMSTATE_PARRY
Definition Unit.h:87
@ VICTIMSTATE_BLOCKS
Definition Unit.h:89
@ VICTIMSTATE_EVADES
Definition Unit.h:90
@ HITINFO_PARTIAL_ABSORB
Definition Unit.h:104
@ HITINFO_FULL_RESIST
Definition Unit.h:105
@ HITINFO_NORMALSWING
Definition Unit.h:97
@ HITINFO_BLOCK
Definition Unit.h:111
@ HITINFO_CRUSHING
Definition Unit.h:115
@ HITINFO_SWINGNOHITSOUND
Definition Unit.h:119
@ HITINFO_MISS
Definition Unit.h:102
@ HITINFO_FULL_ABSORB
Definition Unit.h:103
@ HITINFO_OFFHAND
Definition Unit.h:100
@ HITINFO_GLANCING
Definition Unit.h:114
@ HITINFO_CRITICALHIT
Definition Unit.h:107
@ HITINFO_PARTIAL_RESIST
Definition Unit.h:106
@ HITINFO_AFFECTS_VICTIM
Definition Unit.h:99
@ MELEE_HIT_CRUSHING
Definition Unit.h:287
@ MELEE_HIT_BLOCK
Definition Unit.h:286
@ MELEE_HIT_CRIT
Definition Unit.h:287
@ MELEE_HIT_EVADE
Definition Unit.h:286
@ MELEE_HIT_DODGE
Definition Unit.h:286
@ MELEE_HIT_MISS
Definition Unit.h:286
@ MELEE_HIT_PARRY
Definition Unit.h:286
@ MELEE_HIT_GLANCING
Definition Unit.h:287
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition UnitAI.h:380
bool isBlockCritical()
Definition Unit.cpp:3155
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13374
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6061
bool CanApplyResilience() const
Definition Unit.h:1095
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition Unit.cpp:3013
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition Unit.cpp:19028
UnitAI * GetAI()
Definition Unit.h:648
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition Unit.cpp:2035
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:6010
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition Unit.cpp:2812
uint32 GetCreatureTypeMask() const
Definition Unit.h:778
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13172
uint32 damageSchoolMask
Definition Unit.h:470
uint32 blocked_amount
Definition Unit.h:476
MeleeHitOutcome hitOutCome
Definition Unit.h:485
uint32 cleanDamage
Definition Unit.h:484
uint32 TargetState
Definition Unit.h:478
uint32 resist
Definition Unit.h:473

References CalcDamageInfo::absorb, AddPct(), ApplyResilience(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculateDamage(), CanApplyResilience(), CalcDamageInfo::cleanDamage, CR_CRIT_TAKEN_MELEE, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), GetLevel(), GetMeleeDamageSchoolMask(), DamageInfo::GetResist(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_DAMAGE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1323{
1324 if (damage < 0)
1325 return;
1326
1327 Unit* victim = damageInfo->target;
1328 if (!victim || !victim->IsAlive())
1329 return;
1330
1331 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1332 uint32 crTypeMask = victim->GetCreatureTypeMask();
1333
1334 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1335 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1336
1337 if (victim->GetAI())
1338 {
1339 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1340 }
1341
1342 int32 cleanDamage = 0;
1343 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1344 {
1345 int32 oldDamage = damage;
1346 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1347 cleanDamage = oldDamage - damage;
1348 }
1349
1350 bool blocked = false;
1351 // Per-school calc
1352 switch (spellInfo->DmgClass)
1353 {
1354 // Melee and Ranged Spells
1357 {
1358 // Physical Damage
1359 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1360 {
1361 // Get blocked status
1362 blocked = isSpellBlocked(victim, spellInfo, attackType);
1363 }
1364
1365 if (crit)
1366 {
1367 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1368
1369 // Calculate crit bonus
1370 uint32 crit_bonus = damage;
1371 // Apply crit_damage bonus for melee spells
1372 if (Player* modOwner = GetSpellModOwner())
1373 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1374 damage += crit_bonus;
1375
1376 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1377 float critPctDamageMod = 0.0f;
1378 if (attackType == RANGED_ATTACK)
1380 else
1382
1383 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1384 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1385
1386 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1388
1389 if (critPctDamageMod != 0)
1390 AddPct(damage, critPctDamageMod);
1391 }
1392
1393 // Spell weapon based damage CAN BE crit & blocked at same time
1394 if (blocked)
1395 {
1396 damageInfo->blocked = victim->GetShieldBlockValue();
1397 // double blocked amount if block is critical
1398 if (victim->isBlockCritical())
1399 damageInfo->blocked *= 2;
1400 if (damage < int32(damageInfo->blocked))
1401 damageInfo->blocked = uint32(damage);
1402
1403 damage -= damageInfo->blocked;
1404 cleanDamage += damageInfo->blocked;
1405 }
1406
1407 int32 resilienceReduction = damage;
1408 if (CanApplyResilience())
1409 {
1410 if (attackType != RANGED_ATTACK)
1411 {
1412 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1413 }
1414 else
1415 {
1416 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1417 }
1418 }
1419
1420 resilienceReduction = damage - resilienceReduction;
1421 damage -= resilienceReduction;
1422 cleanDamage += resilienceReduction;
1423 break;
1424 }
1425 // Magical Attacks
1428 {
1429 // If crit add critical bonus
1430 if (crit)
1431 {
1432 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1433 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1434 }
1435
1436 int32 resilienceReduction = damage;
1437 if (CanApplyResilience())
1438 {
1439 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1440 }
1441
1442 resilienceReduction = damage - resilienceReduction;
1443 damage -= resilienceReduction;
1444 cleanDamage += resilienceReduction;
1445 break;
1446 }
1447 default:
1448 break;
1449 }
1450
1451 damageInfo->cleanDamage = std::max(0, cleanDamage);
1452 damageInfo->damage = std::max(0, damage);
1453
1454 // Calculate absorb resist
1455 if (damageInfo->damage > 0)
1456 {
1457 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1458 Unit::CalcAbsorbResist(dmgInfo);
1459 damageInfo->absorb = dmgInfo.GetAbsorb();
1460 damageInfo->resist = dmgInfo.GetResist();
1461 damageInfo->damage = dmgInfo.GetDamage();
1462 }
1463}
@ SPELL_DAMAGE_CLASS_RANGED
Definition SharedDefines.h:1559
@ SPELL_DAMAGE_CLASS_MAGIC
Definition SharedDefines.h:1557
@ SPELL_DAMAGE_CLASS_NONE
Definition SharedDefines.h:1556
@ SPELL_DAMAGE_CLASS_MELEE
Definition SharedDefines.h:1558
@ SPELL_HIT_TYPE_CRIT
Definition SharedDefines.h:1547
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:250
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition UnitAI.h:381
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition Unit.cpp:3129
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition Unit.cpp:12378
Unit * target
Definition Unit.h:496
uint32 HitInfo
Definition Unit.h:507
uint32 damage
Definition Unit.h:499
uint32 absorb
Definition Unit.h:502
Unit * attacker
Definition Unit.h:497
uint32 schoolMask
Definition Unit.h:501
uint32 cleanDamage
Definition Unit.h:509
uint32 resist
Definition Unit.h:503
uint32 blocked
Definition Unit.h:506

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1637 {
1640 }
@ UNIT_STATE_DISTRACTED
Definition UnitDefines.h:182
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
@ UNIT_STATE_IN_FLIGHT
Definition UnitDefines.h:178
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14720{
14721 // only creatures can have threat list
14722 if (!IsCreature())
14723 return false;
14724
14725 // only alive units can have threat list
14726 if (!skipAliveCheck && !IsAlive())
14727 return false;
14728
14729 // totems can not have threat list
14730 if (ToCreature()->IsTotem())
14731 return false;
14732
14733 // vehicles can not have threat list
14734 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14735 return false;
14736
14737 // summons can not have a threat list, unless they are controlled by a creature
14739 return false;
14740
14741 return true;
14742}
@ UNIT_MASK_CONTROLLABLE_GUARDIAN
Definition UnitDefines.h:164
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:158
bool IsVehicle() const
Definition Unit.h:750
Map * GetMap() const
Definition Object.h:621

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1506{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1476{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21097{
21098 // Aura of Despair exceptions
21099 switch (spellInfo->Id)
21100 {
21101 case 16666: // Demonic Rune
21102 case 27869: // Dark Rune
21103 case 30824: // Shamanistic Rage
21104 case 31786: // Spiritual Attunement
21105 case 31930: // Judgements of the Wise
21106 case 34075: // Aspect of the Viper
21107 case 34720: // Thrill of the hunt
21108 case 47755: // Rapture
21109 case 54425: // Improved Felhunter
21110 case 57319: // Blessing of Sanctuary
21111 case 63337: // Saronite Vapors (regenerate mana)
21112 case 63375: // Improved stormstrike
21113 case 64372: // Lifebloom
21114 case 68285: // Improved Leader of the Pack
21115 return true;
21116 case 54428: // Divine Plea - only with talent Guarded by the Light
21117 return HasSpell(53583);
21118 default:
21119 break;
21120 }
21121
21122 return false;
21123}
virtual bool HasSpell(uint32) const
Definition Unit.h:1501

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSparringWith()

bool Unit::CanSparringWith ( Unit const *  attacker) const
protected
3988{
3990 return false;
3991
3992 if (!attacker)
3993 return false;
3994
3995 if (!attacker->IsCreature() || attacker->IsCharmedOwnedByPlayerOrPlayer())
3996 return false;
3997
3998 if (Creature const* creature = ToCreature())
3999 if (!creature->GetSparringPct())
4000 return false;
4001
4002 return true;
4003}
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition Unit.h:1236

References IsCharmedOwnedByPlayerOrPlayer(), Object::IsCreature(), and Object::ToCreature().

Referenced by AttackerStateUpdate(), and DealDamage().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19800{
19801 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19803 return false;
19805 return true;
19807 return false;
19809 return true;
19811}
@ UNIT_FLAG2_UNUSED_6
Definition UnitDefines.h:307
@ UNIT_FLAG_CANNOT_SWIM
Definition UnitDefines.h:264
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:274
@ UNIT_FLAG_SWIMMING
Definition UnitDefines.h:265
@ UNIT_FLAG_RENAME
Definition UnitDefines.h:254
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:261
bool HasUnitFlag2(UnitFlags2 flags) const
Definition Unit.h:708

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by PathGenerator::BuildPolyPath(), and Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1278{
1279 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1280 if (!spellInfo)
1281 {
1282 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1284 }
1285
1286 SpellCastTargets targets;
1287 targets.SetUnitTarget(victim);
1288
1289 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1290}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition SharedDefines.h:1067
Definition Spell.h:118
void SetUnitTarget(Unit *target)
Definition Spell.cpp:239

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetUnitTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [2/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1264{
1265 CustomSpellValues values;
1266 values.AddSpellMod(mod, value);
1267 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1268}
@ TRIGGERED_NONE
Definition SpellDefines.h:133
Definition SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition SpellDefines.h:167
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1251

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [3/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1271{
1272 CustomSpellValues values;
1273 values.AddSpellMod(mod, value);
1274 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1275}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [4/4]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1252{
1253 CustomSpellValues values;
1254 if (bp0)
1255 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1256 if (bp1)
1257 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1258 if (bp2)
1259 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1260 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1261}
@ SPELLVALUE_BASE_POINT1
Definition SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_krik_thir::boss_krik_thirAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_soul_deflection::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_felmyst::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), SmartScript::ProcessAction(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_kiljaeden::ScheduleBasicAbilities(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20159{
20160 AuraEffect* aurEff = nullptr;
20161 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20162 {
20163 aurEff = *i;
20164 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20165 continue;
20166
20167 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20168 break;
20169 }
20170
20171 // xinef: delay only for casting on different unit
20172 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20173 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20174 else
20175 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20176}
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition SpellDefines.h:152
@ CONFIG_MUNCHING_BLIZZLIKE
Definition WorldConfig.h:143
uint32 GetTickNumber() const
Definition SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition SpellAuraEffects.h:117
uint32 GetId() const
Definition SpellAuraEffects.cpp:433
int32 GetTotalTicks() const
Definition SpellAuraEffects.cpp:7383
ObjectGuid GetCasterGUID() const
Definition SpellAuraEffects.h:48
Definition Unit.cpp:20107
uint64 CalculateQueueTime(uint64 delay) const
Definition EventProcessor.cpp:164

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), WorldObject::m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17409{
17410 uint32 auraId = aura->GetAura(GetEntry());
17411 if (!auraId)
17412 return;
17413
17414 if (auraId == 35696) // Demonic Knowledge
17415 {
17416 int32 basePoints = aura->GetDamage();
17417 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17418 }
17419 else
17420 CastSpell(this, auraId, true);
17421}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1293{
1294 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1295 if (!spellInfo)
1296 {
1297 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1299 }
1300
1301 SpellCastTargets targets;
1302 targets.SetDst(x, y, z, GetOrientation());
1303
1304 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1305}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition Spell.cpp:406

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1308{
1309 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1310 if (!spellInfo)
1311 {
1312 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1314 }
1315
1316 SpellCastTargets targets;
1317 targets.SetGOTarget(go);
1318
1319 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1320}
void SetGOTarget(GameObject *target)
Definition Spell.cpp:271

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1195{
1196 if (!spellInfo)
1197 {
1198 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1200 }
1201
1203 if (!originalCaster && triggeredByAura)
1204 {
1205 originalCaster = triggeredByAura->GetCasterGUID();
1206 }
1207
1208 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1209
1210 if (value)
1211 {
1212 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1213 {
1214 spell->SetSpellValue(itr->first, itr->second);
1215 }
1216 }
1217
1218 spell->m_CastItem = castItem;
1219 return spell->prepare(&targets, triggeredByAura);
1220}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8465
Item * m_CastItem
Definition Spell.h:531

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), Player::ApplyItemObtainSpells(), spell_hun_lock_and_load::ApplyMarker(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), CastSpell(), CastSpell(), GameObject::CastSpell(), CastSpell(), CastSpell(), CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_jenny::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CorruptTriggers::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_braziers_hit::HandleAfterEffectApply(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_mirkblood_dash_gash_return_to_tank_pre_spell::HandleCast(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_call_of_the_beast::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_magtheridon_quake::HandleHit(), spell_chapter5_return_to_capital::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), WorldState::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_karazhan_wrath_titans_aura::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_gen_translocate::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_summon_amanishi_sentries::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_azjol_drain_power::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_hawk_hunting::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_alert_drums::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), npc_jenny::Initialize(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::InitializeAI(), boss_gal_darah::boss_gal_darahAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), npc_necropolis_health::JustDied(), npc_necrotic_shard::JustDied(), CombatAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), boss_gal_darah::boss_gal_darahAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::boss_gal_darahAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_pallid_horror::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tomb(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), spell_summon_all_players_dummy::OnHit(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_kalecgos_curse_of_boundless_agony_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_gen_proc_on_victim::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_bjarngrim::boss_bjarngrimAI::RollStance(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_cultist_engineer::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_necropolis_relay::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_necropolis_proxy::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_magus_telestra::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_felmyst::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_ionar::boss_ionarAI::Split(), boss_heigan::boss_heiganAI::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_living_poison::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), boss_bjarngrim::boss_bjarngrimAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1240{
1241 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1242}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1245{
1246 SpellCastTargets targets;
1247 targets.SetUnitTarget(victim);
1248 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1249}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1223{
1224 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1225}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1228{
1229 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1230 if (!spellInfo)
1231 {
1232 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1234 }
1235
1236 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1237}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19551{
19552 if (!m_vehicle)
19553 return;
19554
19555 if (seatId < 0)
19556 {
19557 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19558 if (seatId < 0)
19559 return;
19560 }
19561 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19562 return;
19563
19565 if (!m_vehicle->AddPassenger(this, seatId))
19566 ABORT();
19567}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition Vehicle.cpp:246
bool HasEmptySeat(int8 seatId) const
Definition Vehicle.cpp:220

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15834{
15836 return;
15837
15838 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15840
15841 if (IsInWorld()) // not in world and not being removed atm
15843
15844 ASSERT(GetGUID());
15845
15846 // A unit may be in removelist and not in world, but it is still in grid
15847 // and may have some references during delete
15850
15851 if (finalCleanup)
15852 m_cleanupDone = true;
15853
15854 CombatStop();
15859 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15860}
void deleteReferences(bool removeFromMap=false)
Definition HostileRefMgr.cpp:125
void Clear(bool reset=true)
Definition MotionMaster.h:167
void ClearAllThreat()
Definition ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10535
void RemoveAllGameObjects()
Definition Unit.cpp:6363
void ClearComboPoints()
Definition Unit.cpp:16951
void ClearComboPointHolders()
Definition Unit.cpp:17006
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:902
void RemoveFromWorld() override
Definition Unit.cpp:15787
void RemoveAllAuras()
Definition Unit.cpp:5388
ThreatMgr & GetThreatMgr()
Definition Unit.h:898

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), m_cleanupDone, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15863{
15864 if (GetTransport())
15865 {
15867 SetTransport(nullptr);
15870 }
15871
15872 CleanupBeforeRemoveFromMap(finalCleanup);
15873}
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition Unit.cpp:15833
void SetTransport(Transport *t)
Definition Object.h:691
void Reset()
Definition Object.h:299
void RemoveMovementFlag(uint32 flag)
Definition Object.h:345

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
17015{
17016 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17017 m_reactiveTimer[i] = 0;
17018
17025}
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition SharedDefines.h:1303
@ AURA_STATE_HUNTER_PARRY
Definition SharedDefines.h:1309
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition UnitDefines.h:235
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition Unit.h:794
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10646

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
17007{
17008 while (!m_ComboPointHolders.empty())
17009 {
17010 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
17011 }
17012}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16952{
16953 if (!m_comboTarget)
16954 {
16955 return;
16956 }
16957
16958 // remove Premed-like effects
16959 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16961
16962 m_comboPoints = 0;
16965 m_comboTarget = nullptr;
16966}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1776{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearEmoteState()

void Unit::ClearEmoteState ( )
inline

Sets emote state (looping emote). Emotes available in SharedDefines.h.

void SetEmoteState(Emote emoteState)
Definition Unit.h:713

References EMOTE_ONESHOT_NONE, and SetEmoteState().

Referenced by boss_felblood_kaelthas::DoAction().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13915{
13916 m_CombatTimer = 0;
13918
13919 // Player's state will be cleared in Player::UpdateContestedPvP
13920 if (Creature* creature = ToCreature())
13921 {
13922 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13923 SetImmuneToPC(true); // set immunity state to the one from db on evade
13924
13927 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13928
13929 creature->SetAssistanceTimer(0);
13930
13931 // Xinef: will be recalculated at follow movement generator initialization
13932 if (!IsPet() && !IsCharmed())
13933 return;
13934 }
13935 else if (Player* player = ToPlayer())
13936 {
13937 player->UpdatePotionCooldown();
13938 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13939 for (uint8 i = 0; i < MAX_RUNES; ++i)
13940 player->SetGracePeriod(i, 0);
13941 }
13942
13943 if (Player* player = this->ToPlayer())
13944 {
13945 sScriptMgr->OnPlayerLeaveCombat(player);
13946 }
13947}
#define MAX_RUNES
Definition Player.h:393
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:234
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:269
@ UNIT_FLAG_IMMUNE_TO_PC
Definition UnitDefines.h:258
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:724
bool IsCharmed() const
Definition Unit.h:1237
bool IsPet() const
Definition Unit.h:747
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13706
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:704

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
692{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13725{
13726 // Xinef: Dont allow to start combat with triggers
13727 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13728 return;
13729
13730 if (initialAggro)
13731 {
13732 // Make player victim stand up automatically
13733 if (victim->getStandState() && victim->IsPlayer())
13734 {
13735 victim->SetStandState(UNIT_STAND_STATE_STAND);
13736 }
13737
13738 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13739 {
13740 if (victim->IsPet())
13741 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13742 else
13743 {
13744 victim->ToCreature()->AI()->AttackStart(this);
13745 // if the target is an NPC with a pet or minion, pet should react.
13746 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13747 {
13748 victimControlledUnit->SetInCombatWith(this);
13749 SetInCombatWith(victimControlledUnit);
13750 victimControlledUnit->AddThreat(this, 0.0f);
13751 }
13752 }
13753
13754 // if unit has an owner, put owner in combat.
13755 if (Unit* victimOwner = victim->GetOwner())
13756 {
13757 if (!(victimOwner->IsInCombatWith(this)))
13758 {
13759 /* warding off to not take over aggro for no reason
13760 Using only AddThreat causes delay in attack */
13761 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13762 {
13763 victimOwner->ToCreature()->AI()->AttackStart(this);
13764 }
13765 victimOwner->SetInCombatWith(this);
13766 SetInCombatWith(victimOwner);
13767 victimOwner->AddThreat(this, 0.0f);
13768 }
13769 }
13770 }
13771
13772 bool alreadyInCombat = IsInCombat();
13773
13774 SetInCombatWith(victim);
13775 victim->SetInCombatWith(this);
13776
13777 // Update leash timer when attacking creatures
13778 if (victim->IsCreature() && this != victim)
13779 victim->ToCreature()->UpdateLeashExtensionTime();
13780
13781 // Xinef: If pet started combat - put owner in combat
13782 if (!alreadyInCombat && IsInCombat())
13783 {
13784 if (Unit* owner = GetOwner())
13785 {
13786 owner->SetInCombatWith(victim);
13787 victim->SetInCombatWith(owner);
13788 }
13789 }
13790 }
13791
13792 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13793 if (who->IsPlayer())
13794 SetContestedPvP(who->ToPlayer());
13795
13797 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13798 {
13799 player->UpdatePvP(true);
13801 }
13802}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition SpellDefines.h:66
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:32
@ REACT_PASSIVE
Definition Unit.h:549
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1530
Unit * GetCharmerOrOwnerOrSelf() const
Definition Unit.h:1214
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition Unit.cpp:17335
Unit * GetFirstControlled() const
Definition Unit.cpp:11174

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13805{
13806 // Xinef: Dont allow to start combat with triggers
13807 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13808 return;
13809
13810 if (initialAggro)
13811 {
13812 SetInCombatWith(target, duration);
13813
13814 // Xinef: If pet started combat - put owner in combat
13815 if (Unit* owner = GetOwner())
13816 owner->SetInCombatWith(target, duration);
13817
13818 // Update leash timer when attacking creatures
13819 if (target->IsCreature())
13821 else if (ToCreature()) // Reset leash if it is a spell caster, else it may evade inbetween casts
13823 }
13824
13825 Unit* who = target->GetCharmerOrOwnerOrSelf();
13826 if (who->IsPlayer())
13827 SetContestedPvP(who->ToPlayer());
13828
13830 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13831 {
13832 player->UpdatePvP(true);
13834 }
13835}
bool IsTrigger() const
Definition Creature.h:76

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10536{
10537 if (includingCast && IsNonMeleeSpellCast(false))
10539
10540 AttackStop();
10542 if (IsPlayer())
10543 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10544 if (Creature* pCreature = ToCreature())
10545 pCreature->ClearLastLeashExtensionTimePtr();
10546 ClearInCombat();
10547
10548 // xinef: just in case
10549 if (IsPetInCombat() && !IsPlayer())
10551}
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition Unit.h:882
void ClearInPetCombat()
Definition Unit.cpp:13949
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition Unit.cpp:10583
void ClearInCombat()
Definition Unit.cpp:13914
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10502

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10554{
10555 CombatStop(includingCast);
10556
10557 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10558 (*itr)->CombatStop(includingCast);
10559}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1045{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition Unit.h:1031

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1044{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition Unit.h:1032

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17439{
17440 if (!IsPlayer())
17441 return nullptr;
17442
17443 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17444
17445 if (!pet->CreateBaseAtCreature(creatureTarget))
17446 {
17447 delete pet;
17448 return nullptr;
17449 }
17450
17451 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17452
17453 if (!InitTamedPet(pet, level, spell_id))
17454 {
17455 delete pet;
17456 return nullptr;
17457 }
17458
17459 return pet;
17460}
@ HUNTER_PET
Definition PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition Pet.cpp:941
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition Unit.cpp:17482

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17463{
17464 if (!IsPlayer())
17465 return nullptr;
17466
17467 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17468 if (!creatureInfo)
17469 return nullptr;
17470
17471 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17472
17473 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17474 {
17475 delete pet;
17476 return nullptr;
17477 }
17478
17479 return pet;
17480}
#define sObjectMgr
Definition ObjectMgr.h:1650
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition Pet.cpp:976
Definition CreatureData.h:186

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18817{
18818 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18819 if (!vehInfo)
18820 return false;
18821
18822 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18825 return true;
18826}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UNIT_MASK_VEHICLE
Definition UnitDefines.h:161
@ UPDATEFLAG_VEHICLE
Definition UpdateData.h:46

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

826{
827 damage = sScriptMgr->DealDamage(attacker, victim, damage, damagetype);
828 // Xinef: initialize damage done for rage calculations
829 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
830 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
831
832 //if (attacker)
833 {
834 if (victim->IsAIEnabled)
835 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
836
837 if (attacker && attacker->IsAIEnabled)
838 attacker->GetAI()->DamageDealt(victim, damage, damagetype, damageSchoolMask);
839 }
840
841 // Hook for OnDamage Event
842 sScriptMgr->OnDamage(attacker, victim, damage);
843
844 if (victim->IsPlayer() && attacker != victim)
845 {
846 // Signal to pets that their owner was attacked
847 Pet* pet = victim->ToPlayer()->GetPet();
848
849 if (pet && pet->IsAlive())
850 pet->AI()->OwnerAttackedBy(attacker);
851 }
852
853 //Dont deal damage to unit if .cheat god is enable.
854 if (victim->IsPlayer())
855 {
856 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
857 {
858 return 0;
859 }
860 }
861
862 // Signal the pet it was attacked so the AI can respond if needed
863 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
864 victim->ToPet()->AI()->AttackedBy(attacker);
865
866 if (damagetype != NODAMAGE)
867 {
868 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
869 if (spellProto)
870 {
871 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
873 }
874 else
876
877 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
878 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
879 {
880 if (victim != attacker && victim->IsPlayer())
881 {
882 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
883 {
884 if (spell->getState() == SPELL_STATE_PREPARING)
885 {
886 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
887 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
888 {
889 victim->InterruptNonMeleeSpells(false);
890 }
891 }
892 }
893 }
894 }
895
896 // We're going to call functions which can modify content of the list during iteration over it's elements
897 // Let's copy the list so we can prevent iterator invalidation
899 // copy damage to casters of this aura
900 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
901 {
902 // Check if aura was removed during iteration - we don't need to work on such auras
903 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
904 continue;
905 // check damage school mask
906 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
907 continue;
908
909 Unit* shareDamageTarget = (*i)->GetCaster();
910 if (!shareDamageTarget)
911 continue;
912 SpellInfo const* spell = (*i)->GetSpellInfo();
913
914 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
915
916 uint32 shareAbsorb = 0;
917 uint32 shareResist = 0;
918
919 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
920 {
921 shareAbsorb = shareDamage;
922 shareDamage = 0;
923 }
924 else
925 {
926 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
927 Unit::CalcAbsorbResist(sharedDamageInfo, true);
928 shareAbsorb = sharedDamageInfo.GetAbsorb();
929 shareResist = sharedDamageInfo.GetResist();
930 shareDamage = sharedDamageInfo.GetDamage();
931 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
932 }
933
934 if (attacker && shareDamageTarget->IsPlayer())
935 {
936 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
937 }
938
939 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
940 }
941 }
942
943 // Rage from Damage made (only from direct weapon damage)
944 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
945 {
946 uint32 weaponSpeedHitFactor;
947
948 switch (cleanDamage->attackType)
949 {
950 case BASE_ATTACK:
951 case OFF_ATTACK:
952 {
953 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
954 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
955 weaponSpeedHitFactor *= 2;
956
957 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
958 break;
959 }
960 case RANGED_ATTACK:
961 break;
962 default:
963 break;
964 }
965 }
966
967 if (!damage)
968 {
969 // Rage from absorbed damage
970 if (cleanDamage && cleanDamage->absorbed_damage)
971 {
972 if (victim->HasActivePowerType(POWER_RAGE))
973 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
974
975 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
976 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
977 }
978
979 return 0;
980 }
981
982 LOG_DEBUG("entities.unit", "DealDamageStart");
983
984 uint32 health = victim->GetHealth();
985 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
986
987 // duel ends when player has 1 or less hp
988 bool duel_hasEnded = false;
989 bool duel_wasMounted = false;
990 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
991 {
992 // xinef: situation not possible earlier, just return silently.
993 if (!attacker)
994 return 0;
995
996 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
997 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
998 damage = health - 1;
999
1000 duel_hasEnded = true;
1001 }
1002 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
1003 {
1004 Player* victimRider = victim->GetCharmer()->ToPlayer();
1005
1006 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
1007 {
1008 // xinef: situation not possible earlier, just return silently.
1009 if (!attacker)
1010 return 0;
1011
1012 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
1013 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
1014 damage = health - 1;
1015
1016 duel_wasMounted = true;
1017 duel_hasEnded = true;
1018 }
1019 }
1020
1021 if (attacker && attacker != victim)
1022 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1023 {
1024 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1025 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1026 // return 0;
1027
1028 if (Battleground* bg = killer->GetBattleground())
1029 {
1030 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1031 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1032 }
1033 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1034 }
1035
1036 if (victim->IsPlayer())
1037 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1038 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1039 {
1040 if (!victim->ToCreature()->hasLootRecipient())
1041 victim->ToCreature()->SetLootRecipient(attacker);
1042
1043 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1044 {
1045 uint32 unDamage = health < damage ? health : damage;
1046 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1047 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1048 }
1049 }
1050
1051 // Sparring
1052 if (victim->CanSparringWith(attacker))
1053 {
1054 if (damage >= victim->GetHealth())
1055 damage = 0;
1056
1057 uint32 sparringHealth = victim->GetHealth() * (victim->ToCreature()->GetSparringPct() / 100);
1058 if (victim->GetHealth() - damage <= sparringHealth)
1059 damage = 0;
1060 }
1061
1062 if (health <= damage)
1063 {
1064 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1065
1066 //if (attacker && victim->IsPlayer() && victim != attacker)
1067 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1068 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1069 }
1070 else
1071 {
1072 LOG_DEBUG("entities.unit", "DealDamageAlive");
1073
1074 //if (victim->IsPlayer())
1075 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1076
1077 victim->ModifyHealth(- (int32)damage);
1078
1079 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1080 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1081
1082 if (!victim->IsPlayer())
1083 {
1085 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1087
1088 if (attacker)
1089 {
1090 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1091 {
1092 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1093 }
1094
1095 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1096 }
1097 }
1098 else // victim is a player
1099 {
1100 // random durability for items (HIT TAKEN)
1102 {
1105 }
1106 }
1107
1108 // Rage from damage received
1109 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1110 {
1111 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1112 victim->RewardRage(rageDamage, 0, false);
1113 }
1114
1115 if (attacker && attacker->IsPlayer())
1116 {
1117 // random durability for items (HIT DONE)
1119 {
1121 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1122 }
1123 }
1124
1125 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1126 {
1127 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1128 {
1129 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1130 {
1131 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1132 {
1133 if (spell->getState() == SPELL_STATE_PREPARING)
1134 {
1135 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1136 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1137 {
1138 victim->InterruptNonMeleeSpells(false);
1139 }
1140 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1141 {
1142 spell->Delayed();
1143 }
1144 }
1145 }
1146
1147 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1148 if (spell->getState() == SPELL_STATE_CASTING)
1149 {
1150 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1151 {
1152 spell->DelayedChannel();
1153 }
1154 }
1155 }
1156 }
1157 }
1158
1159 // last damage from duel opponent
1160 if (duel_hasEnded)
1161 {
1162 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1163
1164 ASSERT_NODEBUGINFO(he && he->duel);
1165
1166 if (duel_wasMounted) // In this case victim==mount
1167 victim->SetHealth(1);
1168 else
1169 he->SetHealth(1);
1170
1171 he->duel->Opponent->CombatStopWithPets(true);
1172 he->CombatStopWithPets(true);
1173
1174 he->CastSpell(he, 7267, true); // beg
1176 }
1177 }
1178
1179 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1180
1181 return damage;
1182}
@ SCORE_DAMAGE_DONE
Definition BattlegroundScore.h:32
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition DBCEnums.h:130
#define ASSERT_NODEBUGINFO
Definition Errors.h:69
@ CHEAT_GOD
Definition Player.h:995
EquipmentSlots
Definition Player.h:669
@ EQUIPMENT_SLOT_END
Definition Player.h:690
bool roll_chance_f(float chance)
Definition Random.h:57
@ POWER_RAGE
Definition SharedDefines.h:281
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition SharedDefines.h:658
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition SharedDefines.h:529
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition SharedDefines.h:521
@ DUEL_WON
Definition SharedDefines.h:3879
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition SharedDefines.h:555
@ SPELL_AURA_DAMAGE_SHIELD
Definition SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition SpellAuraDefines.h:363
@ CHANNEL_FLAG_DELAY
Definition SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition SpellDefines.h:27
@ SPELL_STATE_PREPARING
Definition Spell.h:234
@ SPELL_STATE_CASTING
Definition Spell.h:235
@ NODAMAGE
Definition Unit.h:253
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:540
@ CURRENT_GENERIC_SPELL
Definition Unit.h:539
@ RATE_DURABILITY_LOSS_DAMAGE
Definition WorldConfig.h:473
virtual void OwnerAttackedBy(Unit *)
Definition CreatureAI.h:177
virtual void AttackedBy(Unit *)
Definition CreatureAI.h:154
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition Creature.cpp:1331
bool hasLootRecipient() const
Definition Creature.h:235
float GetSparringPct() const
Definition Creature.h:192
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition Creature.cpp:3829
bool IsPlayer() const
Definition ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2167
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition Player.cpp:4853
Pet * GetPet() const
Definition Player.cpp:8994
bool GetCommandStatus(uint32 command) const
Definition Player.h:1189
uint32 ChannelInterruptFlags
Definition SpellInfo.h:354
uint32 InterruptFlags
Definition SpellInfo.h:352
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage to any victim (before damage apply)
Definition UnitAI.h:361
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition UnitAI.h:368
int32 ModifyHealth(int32 val)
Definition Unit.cpp:14196
Pet * ToPet()
Definition Unit.h:684
bool IsCreatedByPlayer() const
Definition Unit.h:1235
Unit * GetCharmer() const
Definition Unit.cpp:10707
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition Unit.cpp:17803
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition Unit.cpp:19970
void SetHealth(uint32 val)
Definition Unit.cpp:15583
ObjectGuid GetCharmerGUID() const
Definition Unit.h:674
virtual bool HasActivePowerType(Powers power)
Definition Unit.h:1055
void CombatStopWithPets(bool includingCast=false)
Definition Unit.cpp:10553

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CanSparringWith(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), Creature::GetSparringPct(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_necrotic_shard::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
11051{
11052 int32 gain = 0;
11053
11054 if (healer)
11055 {
11056 if (victim->IsAIEnabled)
11057 victim->GetAI()->HealReceived(healer, addhealth);
11058
11059 if (healer->IsAIEnabled)
11060 healer->GetAI()->HealDone(victim, addhealth);
11061 }
11062
11063 if (addhealth)
11064 gain = victim->ModifyHealth(int32(addhealth));
11065
11066 // Hook for OnHeal Event
11067 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
11068
11069 Unit* unit = healer;
11070
11071 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
11072 unit = healer->GetOwner();
11073
11074 if (!unit)
11075 return gain;
11076
11077 if (Player* player = unit->ToPlayer())
11078 {
11079 if (Battleground* bg = player->GetBattleground())
11080 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
11081
11082 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
11083 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
11084 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
11085
11086 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
11087 }
11088
11089 /*if (Player* player = victim->ToPlayer())
11090 {
11091 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
11092 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
11093 }*/
11094
11095 return gain;
11096}
@ SCORE_HEALING_DONE
Definition BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition UnitAI.h:371
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition UnitAI.h:377

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
Todo:
: Move this to a packet handler
1857{
1858 Unit* victim = damageInfo->target;
1859
1860 auto canTakeMeleeDamage = [&]()
1861 {
1862 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1863 };
1864
1865 if (!canTakeMeleeDamage())
1866 {
1867 return;
1868 }
1869
1870 // Hmmmm dont like this emotes client must by self do all animations
1871 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1873 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1875
1876 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1877 bool isParryHasteEnabled = !victim->IsCreature() ||
1879 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1880 {
1881 // Get attack timers
1882 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1883 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1884 // Reduce attack time
1885 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1886 {
1887 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1888 float percent60 = 3.0f * percent20;
1889 if (offtime > percent20 && offtime <= percent60)
1890 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1891 else if (offtime > percent60)
1892 {
1893 offtime -= 2.0f * percent20;
1894 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1895 }
1896 }
1897 else
1898 {
1899 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1900 float percent60 = 3.0f * percent20;
1901 if (basetime > percent20 && basetime <= percent60)
1902 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1903 else if (basetime > percent60)
1904 {
1905 basetime -= 2.0f * percent20;
1906 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1907 }
1908 }
1909 }
1910
1911 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1912 {
1913 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1914 {
1915 continue;
1916 }
1917
1918 // Call default DealDamage
1919 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1920 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1921 }
1922
1923 // gain rage if attack is fully blocked, dodged or parried
1925 {
1926 switch (damageInfo->attackType)
1927 {
1928 case BASE_ATTACK:
1929 case OFF_ATTACK:
1930 {
1931 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1932 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1933 break;
1934 }
1935 default:
1936 break;
1937 }
1938 }
1939
1940 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1941 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1942 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1943 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1944 {
1945 // -probability is between 0% and 40%
1946 // 20% base chance
1947 float Probability = 20.0f;
1948
1949 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1950 if (victim->GetLevel() < 30)
1951 Probability = 0.65f * victim->GetLevel() + 0.5f;
1952
1953 uint32 VictimDefense = victim->GetDefenseSkillValue();
1954 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1955
1956 // xinef: fix daze mechanics
1957 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1958
1959 if (Probability > 40.0f)
1960 Probability = 40.0f;
1961
1962 // Daze application
1963 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1964 if (roll_chance_f(std::max(0.0f, Probability)))
1965 CastSpell(victim, 1604, true);
1966 }
1967
1968 if (IsPlayer())
1969 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1970
1971 // Do effect if any damage done to target
1972 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1973 {
1974 // We're going to call functions which can modify content of the list during iteration over it's elements
1975 // Let's copy the list so we can prevent iterator invalidation
1977 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1978 {
1979 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1980 // Damage shield can be resisted...
1981 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1982 {
1983 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1984 continue;
1985 }
1986
1987 // ...or immuned
1988 if (IsImmunedToDamageOrSchool(i_spellProto))
1989 {
1990 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1991 continue;
1992 }
1993
1994 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
1995
1996 if (Unit* caster = (*dmgShieldItr)->GetCaster())
1997 {
1998 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
1999 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
2000 }
2001
2002 uint32 absorb = 0;
2003
2004 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
2005 Unit::CalcAbsorbResist(dmgInfo);
2006 absorb = dmgInfo.GetAbsorb();
2007 damage = dmgInfo.GetDamage();
2008
2009 Unit::DealDamageMods(this, damage, &absorb);
2010
2012 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
2013 data << victim->GetGUID();
2014 data << GetGUID();
2015 data << uint32(i_spellProto->Id);
2016 data << uint32(damage); // Damage
2017 int32 overkill = int32(damage) - int32(GetHealth());
2018 data << uint32(overkill > 0 ? overkill : 0); // Overkill
2019 data << uint32(i_spellProto->GetSchoolMask());
2020 victim->SendMessageToSet(&data, true);
2021
2022 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
2023 }
2024 }
2025}
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition CreatureData.h:48
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition SharedDefines.h:1935
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition SharedDefines.h:1941
SpellMissInfo
Definition SharedDefines.h:1529
@ CONFIG_ENABLE_DAZE
Definition WorldConfig.h:144
bool isWorldBoss() const
Definition Creature.h:121
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7271
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1998
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition Unit.h:1114
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition Unit.cpp:6545
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3654
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition Unit.cpp:6569
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition Unit.cpp:3499
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition Unit.cpp:11887
void HandleEmoteCommand(uint32 emoteId)
Definition Unit.cpp:2027
@ SMSG_SPELLDAMAGESHIELD
Definition Opcodes.h:621
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:283
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:141

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), Creature::GetCreatureTemplate(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1466{
1467 if (damageInfo == 0)
1468 return;
1469
1470 Unit* victim = damageInfo->target;
1471
1472 if (!victim)
1473 return;
1474
1475 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1476 return;
1477
1478 SpellInfo const* spellProto = damageInfo->spellInfo;
1479 if (!spellProto)
1480 {
1481 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1482 return;
1483 }
1484
1485 // Call default DealDamage
1486 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1487 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1488}
bool IsInFlight() const
Definition Unit.h:1619
SpellInfo const * spellInfo
Definition Unit.h:498

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5532{
5533 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5534 for (; range.first != range.second; ++range.first)
5535 {
5536 Aura* aura = range.first->second;
5537 if (!caster || aura->GetCasterGUID() == caster)
5538 {
5539 if (aura->GetDuration() < delaytime)
5540 aura->SetDuration(0);
5541 else
5542 aura->SetDuration(aura->GetDuration() - delaytime);
5543
5544 // update for out of range group members (on 1 slot use)
5546 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5547 }
5548 }
5549}
int32 GetDuration() const
Definition SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition SpellAuras.cpp:868
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition Unit.h:627

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15911{
15912 if (!m_charmInfo)
15913 return;
15914
15916 delete m_charmInfo;
15917 m_charmInfo = nullptr;
15918}
void RestoreState()
Definition CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4419{
4421}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:16849
uint32 GetNativeDisplayId() const
Definition Unit.h:1889

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18377{
18378 if (!IsCreature())
18379 return;
18380
18381 if (apply)
18385}
@ UNIT_STATE_POSSESSED
Definition UnitDefines.h:186
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:703

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13623{
13624 if (!IsMounted())
13625 return;
13626
13629
13630 if (Player* thisPlayer = ToPlayer())
13631 {
13632 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13633 data << GetPackGUID();
13634 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13635 data << thisPlayer->GetCollisionHeight();
13636 thisPlayer->GetSession()->SendPacket(&data);
13637 }
13638
13639 WorldPacket data(SMSG_DISMOUNT, 8);
13640 data << GetPackGUID();
13641 SendMessageToSet(&data, true);
13642
13643 // dismount as a vehicle
13644 if (IsPlayer() && GetVehicleKit())
13645 {
13646 // Send other players that we are no longer a vehicle
13647 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13648 data << GetPackGUID();
13649 data << uint32(0);
13650 ToPlayer()->SendMessageToSet(&data, true);
13651 // Remove vehicle from player
13653 }
13654
13656
13657 // only resummon old pet if the player is already added to a map
13658 // this prevents adding a pet to a not created map which would otherwise cause a crash
13659 // (it could probably happen when logging in after a previous crash)
13660 if (Player* player = ToPlayer())
13661 {
13662 sScriptMgr->AnticheatSetUnderACKmount(player);
13663
13664 if (Pet* pPet = player->GetPet())
13665 {
13666 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13667 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13668 }
13669 else
13670 player->ResummonPetTemporaryUnSummonedIfAny();
13671
13672 // xinef: if we have charmed npc, remove stun also
13673 if (Unit* charm = player->GetCharm())
13674 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13675 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13676 }
13677}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition SpellDefines.h:49
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:268
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:277
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5705
void RemoveVehicleKit()
Definition Unit.cpp:18828
@ SMSG_PLAYER_VEHICLE_DATA
Definition Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition Opcodes.h:1332
@ SMSG_DISMOUNT
Definition Opcodes.h:970

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11368{
11369 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11370
11371 if (powerType != POWER_HAPPINESS && gainedPower)
11372 {
11373 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11374 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11375 }
11376
11377 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11378}
@ POWER_HAPPINESS
Definition SharedDefines.h:284
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition Unit.cpp:11356

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19474{
19476
19477 if (Player* player = ToPlayer())
19478 {
19479 sScriptMgr->AnticheatSetUnderACKmount(player);
19480 }
19481}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20357{
20359 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20360 return;
20361
20362 Acore::AIRelocationNotifier notifier(*this);
20363 float radius = 60.0f;
20364 Cell::VisitObjects(this, notifier, radius);
20365}
@ NOTIFY_AI_RELOCATION
Definition Object.h:69
void RemoveFromNotify(uint16 f)
Definition Object.h:659
Definition GridNotifiers.h:91
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20256{
20258 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20259 return;
20260
20261 if (this->HasSharedVision())
20262 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20263 if (Player* player = (*itr))
20264 {
20265 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20266 continue;
20267 WorldObject* viewPoint = player;
20268 if (player->m_seer && player->m_seer->IsInWorld())
20269 viewPoint = player->m_seer;
20270 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20271 continue;
20272
20273 if (Unit* active = viewPoint->ToUnit())
20274 {
20275 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20276 // active = player;
20277
20278 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20279 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20280 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20281 float distsq = dx * dx + dy * dy + dz * dz;
20282 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20283 if (distsq < mindistsq)
20284 continue;
20285
20286 // this will be relocated below sharedvision!
20287 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20288 }
20289
20290 Acore::PlayerRelocationNotifier notifier(*player);
20291 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20293 notifier.SendToSelf();
20294 }
20295
20296 if (Player* player = this->ToPlayer())
20297 {
20298 WorldObject* viewPoint = player;
20299 if (player->m_seer && player->m_seer->IsInWorld())
20300 viewPoint = player->m_seer;
20301
20302 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20303 return;
20304
20305 if (Unit* active = viewPoint->ToUnit())
20306 {
20307 if (active->IsVehicle())
20308 active = player;
20309
20310 if (!player->GetFarSightDistance())
20311 {
20312 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20313 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20314 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20315 float distsq = dx * dx + dy * dy + dz * dz;
20316
20317 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20318 if (distsq < mindistsq)
20319 return;
20320
20321 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20322 }
20323 }
20324
20326
20327 Acore::PlayerRelocationNotifier notifier(*player);
20328 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20330 notifier.SendToSelf();
20331
20333 }
20334 else if (Creature* unit = this->ToCreature())
20335 {
20336 if (!unit->IsPositionValid())
20337 return;
20338
20339 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20340 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20341 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20342 float distsq = dx * dx + dy * dy + dz * dz;
20343 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20344 if (distsq < mindistsq)
20345 return;
20346
20347 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20348
20349 Acore::CreatureRelocationNotifier relocate(*unit);
20350 Cell::VisitObjects(unit, relocate, unit->GetVisibilityRange());
20351
20353 }
20354}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:30
#define VISIBILITY_DISTANCE_GIGANTIC
Definition ObjectDefines.h:34
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:70
static float GetReqMoveDistSq(uint32 map_type)
Definition DynamicVisibility.h:53
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:220
Unit * ToUnit()
Definition Object.h:210
SharedVisionList const & GetSharedVisionList()
Definition Unit.h:1790
bool HasSharedVision() const
Definition Unit.h:1793
uint32 GetMapId() const
Definition Position.h:280
Definition Object.h:472
void AddToNotify(uint16 f)
Definition Object.cpp:2946
Definition GridNotifiers.h:83
Definition GridNotifiers.h:74
static void VisitFarVisibleObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185
bool IsPositionValid() const
Definition Position.cpp:176

References WorldObject::AddToNotify(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), Map::LoadGridsInRange(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_DISTANCE_GIGANTIC, Cell::VisitFarVisibleObjects(), and Cell::VisitObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19570{
19572 if (!m_vehicle)
19573 return;
19574
19576 if (Player* player = ToPlayer())
19577 {
19578 player->SetCanTeleport(true);
19579 }
19583 /*_ExitVehicle(exitPosition);*/
19590
19591 if (Player* player = ToPlayer())
19592 {
19593 sScriptMgr->AnticheatSetUnderACKmount(player);
19594 }
19595}
Unit * GetVehicleBase() const
Definition Unit.cpp:18843

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), MotionTransport::DelayedTeleportTransport(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4148{
4149 Spell* spell = m_currentSpells[spellType];
4150 if (!spell)
4151 return;
4152
4153 if (spellType == CURRENT_CHANNELED_SPELL)
4154 spell->SendChannelUpdate(0);
4155
4156 spell->finish(ok);
4157}
void SendChannelUpdate(uint32 time)
Definition Spell.cpp:5208

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10725{
10726 if (!GetCharmerOrOwnerGUID())
10727 return const_cast<Unit*>(this)->ToPlayer();
10728
10729 if (Unit* owner = GetCharmerOrOwner())
10731
10732 return nullptr;
10733}
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1222

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
648{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), spell_kologarn_focused_eyebeam::FilterTargetsInitial(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), WorldState::HandleActiveZone(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_random_aggro::HandleOnHit(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), npc_dark_fiend::Reset(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10951{
10952 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10953 {
10954 Unit* unit = *itr;
10955 ++itr;
10956 if (unit->GetEntry() == entry && unit->IsCreature()
10957 && unit->ToCreature()->IsSummon()) // minion, actually
10958 Minions.push_back(unit->ToCreature());
10959 }
10960}
bool IsSummon() const
Definition Unit.h:744

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17306{
17307 if (!normalized || !IsPlayer())
17308 return float(GetAttackTime(attType)) / 1000.0f;
17309
17310 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17311 if (!Weapon)
17312 return 2.4f; // fist attack
17313
17314 switch (Weapon->GetTemplate()->InventoryType)
17315 {
17316 case INVTYPE_2HWEAPON:
17317 return 3.3f;
17318 case INVTYPE_RANGED:
17320 case INVTYPE_THROWN:
17321 return 2.8f;
17322 case INVTYPE_WEAPON:
17325 default:
17326 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17327 }
17328}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition ItemTemplate.h:359
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
Weapon
Definition boss_arlokk.cpp:67
Definition Item.h:220
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:488
uint32 SubClass
Definition ItemTemplate.h:622

References GetAttackTime(), Item::GetTemplate(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1307{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
756{
757 if (GetVictim() != nullptr)
758 return GetVictim();
759
760 if (!IsEngaged())
761 return nullptr;
762
763 if (!m_attackers.empty())
764 return *(m_attackers.begin());
765
766 return nullptr;
767}
bool IsEngaged() const
Definition Unit.h:876

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5651{
5652 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5653 return aurApp ? aurApp->GetBase() : nullptr;
5654}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5631

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5632{
5633 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5634 for (; range.first != range.second; ++range.first)
5635 {
5636 AuraApplication* app = range.first->second;
5637 Aura const* aura = app->GetBase();
5638
5639 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5640 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5641 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5642 && (!except || except != app))
5643 {
5644 return app;
5645 }
5646 }
5647 return nullptr;
5648}
uint8 GetEffectMask() const
Definition SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:630

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5657{
5658 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5659 while (rankSpell)
5660 {
5661 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5662 return aurApp;
5663 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5664 }
5665 return nullptr;
5666}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5752{
5753 uint32 count = 0;
5754 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5755
5756 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5757 {
5758 if (itr->second->GetBase()->GetStackAmount() == 0)
5759 ++count;
5760 else
5761 count += (uint32)itr->second->GetBase()->GetStackAmount();
5762 }
5763
5764 return count;
5765}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5604{
5605 AuraEffectList const& auras = GetAuraEffectsByType(type);
5606 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5607 {
5608 SpellInfo const* spell = (*i)->GetSpellInfo();
5609 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5610 {
5611 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5612 continue;
5613 return (*i);
5614 }
5615 }
5616 return nullptr;
5617}
flag96 SpellFamilyFlags
Definition SpellInfo.h:388
uint32 SpellFamilyName
Definition SpellInfo.h:387
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition Util.h:468

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5590{
5591 AuraEffectList const& auras = GetAuraEffectsByType(type);
5592 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5593 {
5594 if (effIndex != (*itr)->GetEffIndex())
5595 continue;
5596 SpellInfo const* spell = (*itr)->GetSpellInfo();
5597 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5598 return *itr;
5599 }
5600 return nullptr;
5601}
uint32 SpellIconID
Definition SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5564{
5565 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5566 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5567 {
5568 if (itr->second->HasEffect(effIndex)
5569 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5570 {
5571 return itr->second->GetBase()->GetEffect(effIndex);
5572 }
5573 }
5574 return nullptr;
5575}

References AuraEffect::GetBase(), Aura::GetEffect(), and m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5620{
5622 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5623 {
5624 if ((*itr)->GetId() == spellid)
5625 return *itr;
5626 }
5627
5628 return nullptr;
5629}
@ SPELL_AURA_DUMMY
Definition SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5578{
5579 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5580 while (rankSpell)
5581 {
5582 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5583 return aurEff;
5584 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5585 }
5586 return nullptr;
5587}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5563

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), GetDiseasesByCaster(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1351{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), RedirectSpellEvent::Execute(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_warr_heroic_strike::HandleOnHit(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), Player::TeleportTo(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5669{
5670 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5671 return aurApp ? aurApp->GetBase() : nullptr;
5672}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5656

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods(), and spell_dk_pestilence::HandleScriptEffect().

◆ GetBoundaryRadius()

float Unit::GetBoundaryRadius ( ) const
inline
@ UNIT_FIELD_BOUNDINGRADIUS
Definition UpdateFields.h:122

References Object::m_floatValues, and UNIT_FIELD_BOUNDINGRADIUS.

Referenced by IsWithinBoundaryRadius().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17166{
17167 // Not apply this to creature casted spells with casttime == 0
17168 if (CastingTime == 0 && IsCreature() && !IsPet())
17169 return 3500;
17170
17171 if (CastingTime > 7000) CastingTime = 7000;
17172 if (CastingTime < 1500) CastingTime = 1500;
17173
17174 if (damagetype == DOT && !spellProto->IsChanneled())
17175 CastingTime = 3500;
17176
17177 int32 overTime = 0;
17178 uint8 effects = 0;
17179 bool DirectDamage = false;
17180 bool AreaEffect = false;
17181
17182 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17183 {
17184 switch (spellProto->Effects[i].Effect)
17185 {
17191 case SPELL_EFFECT_HEAL:
17192 DirectDamage = true;
17193 break;
17195 switch (spellProto->Effects[i].ApplyAuraName)
17196 {
17200 if (spellProto->GetDuration())
17201 overTime = spellProto->GetDuration();
17202 break;
17203 default:
17204 // -5% per additional effect
17205 ++effects;
17206 break;
17207 }
17208 default:
17209 break;
17210 }
17211
17212 if (spellProto->Effects[i].IsTargetingArea())
17213 AreaEffect = true;
17214 }
17215
17216 // Combined Spells with Both Over Time and Direct Damage
17217 if (overTime > 0 && DirectDamage)
17218 {
17219 // mainly for DoTs which are 3500 here otherwise
17220 uint32 OriginalCastTime = spellProto->CalcCastTime();
17221 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17222 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17223 // Portion to Over Time
17224 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17225
17226 if (damagetype == DOT)
17227 CastingTime = uint32(CastingTime * PtOT);
17228 else if (PtOT < 1.0f)
17229 CastingTime = uint32(CastingTime * (1 - PtOT));
17230 else
17231 CastingTime = 0;
17232 }
17233
17234 // Area Effect Spells receive only half of bonus
17235 if (AreaEffect)
17236 CastingTime /= 2;
17237
17238 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17239 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17240 {
17241 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17242 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17243 {
17244 CastingTime /= 2;
17245 break;
17246 }
17247 }
17248
17249 // -5% of total per any additional effect
17250 for (uint8 i = 0; i < effects; ++i)
17251 CastingTime *= 0.95f;
17252
17253 return CastingTime;
17254}
@ SPELL_EFFECT_POWER_BURN
Definition SharedDefines.h:851
@ SPELL_EFFECT_HEALTH_LEECH
Definition SharedDefines.h:798
@ SPELL_EFFECT_HEAL
Definition SharedDefines.h:799
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition SharedDefines.h:796
@ SPELL_EFFECT_POWER_DRAIN
Definition SharedDefines.h:797
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition SharedDefines.h:791
@ SPELL_EFFECT_APPLY_AURA
Definition SharedDefines.h:795
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10771{
10772 if (ObjectGuid charm_guid = GetCharmGUID())
10773 {
10774 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10775 return pet;
10776
10777 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10779 }
10780
10781 return nullptr;
10782}
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:712
ObjectGuid GetCharmGUID() const
Definition Unit.h:676
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:199

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1215 {
1216 if (Unit* u = GetCharmerOrOwner())
1217 return u;
1218
1219 return (Unit*)this;
1220 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10716{
10718 if (guid.IsPlayer())
10719 return ObjectAccessor::GetPlayer(*this, guid);
10720
10721 return const_cast<Unit*>(this)->ToPlayer();
10722}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
793{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), Player::CheckSkillLearnedBySpell(), spell_class_call_handler::FilterTargets(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

20971{
20972 float scaleMod = GetObjectScale(); // 99% sure about this
20973 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
20974
20975 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20976 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20977 float collisionHeight = 0.0f;
20978
20979 if (IsMounted())
20980 {
20982 {
20983 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20984 {
20985 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
20986 }
20987 }
20988 }
20989 else
20990 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
20991
20992 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
20993}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition ObjectDefines.h:49
float GetObjectScale() const
Definition Object.h:119
Definition DBCStructure.h:721
uint32 ModelId
Definition DBCStructure.h:723
float scale
Definition DBCStructure.h:726
Definition DBCStructure.h:775
float Scale
Definition DBCStructure.h:779
float CollisionHeight
Definition DBCStructure.h:790

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), GetRandomContactPoint(), WorldSession::HandleMovementOpcodes(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

20965{
20966 return GetCollisionWidth() / 2;
20967}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition Unit.cpp:20927

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

20928{
20929 if (IsPlayer())
20930 return GetObjectSize();
20931
20932 float scaleMod = GetObjectScale(); // 99% sure about this
20933 float objectSize = GetObjectSize();
20934 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
20935
20937 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20938 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20939
20940 if (IsMounted())
20941 {
20943 {
20944 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20945 {
20946 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
20947 modelData = mountModelData;
20948 }
20949 }
20950 }
20951
20952 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
20953 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
20954 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
20955}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:44
float GetObjectSize() const
Definition Object.cpp:2764
float CollisionWidth
Definition DBCStructure.h:789

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19296{
19297 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19298 return CalculatePct(damage, percent);
19299}
float GetCombatRatingReduction(CombatRating cr) const
Definition Unit.cpp:19283

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19284{
19285 if (Player const* player = ToPlayer())
19286 return player->GetRatingBonusValue(cr);
19287 // Player's pet get resilience from owner
19288 else if (IsPet() && GetOwner())
19289 if (Player* owner = GetOwner()->ToPlayer())
19290 return owner->GetRatingBonusValue(cr);
19291
19292 return 0.0f;
19293}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
889{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
954{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
955{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10766{
10768}
@ SUMMON_SLOT_MINIPET
Definition SharedDefines.h:3566
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15752{
15753 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15754 switch (power)
15755 {
15756 case POWER_MANA:
15757 return GetCreateMana();
15758 case POWER_RAGE:
15759 return 1000;
15760 case POWER_FOCUS:
15761 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15762 case POWER_ENERGY:
15763 return 100;
15764 case POWER_HAPPINESS:
15765 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15766 case POWER_RUNIC_POWER:
15767 return 1000;
15768 case POWER_RUNE:
15769 return 0;
15770 case POWER_HEALTH:
15771 return 0;
15772 default:
15773 break;
15774 }
15775
15776 return 0;
15777}
@ POWER_HEALTH
Definition SharedDefines.h:289
@ POWER_RUNIC_POWER
Definition SharedDefines.h:286
@ POWER_ENERGY
Definition SharedDefines.h:283
@ POWER_RUNE
Definition SharedDefines.h:285
@ POWER_FOCUS
Definition SharedDefines.h:282
uint32 GetCreateMana() const
Definition Unit.h:1072

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15288{
15289 if (IsPlayer())
15290 {
15292 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15293 if (ssEntry && ssEntry->creatureType > 0)
15294 return ssEntry->creatureType;
15295 else
15297 }
15298 else
15299 return ToCreature()->GetCreatureTemplate()->type;
15300}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition SharedDefines.h:2645
ShapeshiftForm
Definition UnitDefines.h:68
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1870
uint32 type
Definition CreatureData.h:222
Definition DBCStructure.h:1818
int32 creatureType
Definition DBCStructure.h:1824

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
779 {
780 uint32 creatureType = GetCreatureType();
781 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
782 }
uint32 GetCreatureType() const
Definition Unit.cpp:15287

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1496{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4222{
4223 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4224 return spell->GetCastTime();
4225 return 0;
4226}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4213

References FindCurrentSpellBySpellId(), and Spell::GetCastTime().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from Object.

21201{
21202 std::stringstream sstr;
21203 sstr << WorldObject::GetDebugInfo() << "\n"
21204 << std::boolalpha
21205 << "AliveState: " << IsAlive()
21206 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21207 << " Class: " << std::to_string(getClass());
21208 return sstr.str();
21209}
std::string GetDebugInfo() const override
Definition Object.cpp:2463

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16733{
16734 return IDLE_MOTION_TYPE;
16735}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3655{
3656 if (IsPlayer())
3657 {
3658 // in PvP use full skill instead current skill value
3659 uint32 value = (target && target->IsPlayer())
3662 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3663 return value;
3664 }
3665 else
3666 return GetUnitMeleeSkill(target);
3667}
@ SKILL_DEFENSE
Definition SharedDefines.h:3131
@ CR_DEFENSE_SKILL
Definition Unit.h:219
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5486
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5503

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15113{
15114 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15115 {
15116 if (i->DRGroup != group)
15117 continue;
15118
15119 if (!i->hitCount)
15120 return DIMINISHING_LEVEL_1;
15121
15122 if (!i->hitTime)
15123 return DIMINISHING_LEVEL_1;
15124
15125 // If last spell was casted more than 15 seconds ago - reset the count.
15126 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15127 {
15128 i->hitCount = DIMINISHING_LEVEL_1;
15129 return DIMINISHING_LEVEL_1;
15130 }
15131 // or else increase the count.
15132 else
15133 return DiminishingLevels(i->hitCount);
15134 }
15135 return DIMINISHING_LEVEL_1;
15136}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5914{
5915 static const AuraType diseaseAuraTypes[] =
5916 {
5917 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5918 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5920 };
5921
5922 ObjectGuid drwGUID;
5923
5924 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5925 drwGUID = playerCaster->getRuneWeaponGUID();
5926
5927 uint32 diseases = 0;
5928 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5929 {
5930 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5931 {
5932 // Get auras with disease dispel type by caster
5933 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5934 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5935 {
5936 ++diseases;
5937
5938 if (mode == 1)
5939 {
5940 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5941 i = m_modAuras[diseaseAuraTypes[index]].begin();
5942 continue;
5943 }
5944 // used for glyph of scourge strike
5945 else if (mode == 2)
5946 {
5947 Aura* aura = (*i)->GetBase();
5948 uint32 countMin = aura->GetMaxDuration();
5949 uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000;
5950
5951 if (AuraEffect const* epidemic = (*i)->GetCaster()->GetAuraEffectOfRankedSpell(49036, EFFECT_0))
5952 countMax += epidemic->GetAmount();
5953
5954 if (countMin < countMax)
5955 {
5956 aura->SetDuration(uint32(aura->GetDuration() + 3000));
5957 aura->SetMaxDuration(countMin + 3000);
5958 }
5959 }
5960 }
5961 ++i;
5962 }
5963 }
5964 return diseases;
5965}
@ EFFECT_0
Definition SharedDefines.h:31
@ DISPEL_DISEASE
Definition SharedDefines.h:1386
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
int32 GetMaxDuration() const
Definition SpellAuras.h:129
void SetMaxDuration(int32 duration)
Definition SpellAuras.h:130
int32 GetMaxDuration() const
Definition SpellInfo.cpp:2357
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5577

References DISPEL_DISEASE, EFFECT_0, GetAuraEffectOfRankedSpell(), AuraEffect::GetCaster(), Aura::GetDuration(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::GetSpellInfo(), m_modAuras, RemoveAura(), Aura::SetDuration(), Aura::SetMaxDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5675{
5676 // we should not be able to dispel diseases if the target is affected by unholy blight
5677 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5678 dispelMask &= ~(1 << DISPEL_DISEASE);
5679
5680 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5681 bool positive = rank >= REP_FRIENDLY;
5682
5683 // Neutral unit not at war with caster should be treated as a friendly unit
5684 if (rank == REP_NEUTRAL)
5685 {
5686 if (Player* casterPlayer = caster->GetAffectingPlayer())
5687 {
5688 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5689 {
5690 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5691 {
5692 if (factionEntry->CanBeSetAtWar())
5693 {
5694 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5695 }
5696 }
5697 }
5698 }
5699 }
5700
5701 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5702 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5703 {
5704 Aura* aura = itr->second->GetBase();
5705
5706 // don't try to remove passive auras
5707 if (aura->IsPassive())
5708 continue;
5709
5710 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5711 {
5712 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5713 {
5714 // do not remove positive auras if friendly target
5715 // negative auras if non-friendly target
5716 if (itr->second->IsPositive() == positive)
5717 continue;
5718 }
5719
5720 // Banish should only be dispelled by Mass Dispel
5721 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5722 {
5723 continue;
5724 }
5725
5726 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5727 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5728 // Polymorph instead of 1 / (5 + 1) -> 16%.
5729 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5730 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5731 if (charges > 0)
5732 dispelList.push_back(std::make_pair(aura, charges));
5733 }
5734 }
5735}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition SharedDefines.h:662
@ MECHANIC_BANISH
Definition SharedDefines.h:1354
@ SPELL_ATTR0_NO_IMMUNITIES
Definition SharedDefines.h:422
@ REP_FRIENDLY
Definition SharedDefines.h:184
@ DISPEL_MAGIC
Definition SharedDefines.h:1384
uint8 GetStackAmount() const
Definition SpellAuras.h:148
uint8 GetCharges() const
Definition SpellAuras.h:141
bool IsPassive() const
Definition SpellAuras.cpp:1082
uint32 Mechanic
Definition SpellInfo.h:323
uint32 Dispel
Definition SpellInfo.h:322
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5790
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:642
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1458

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::CheckCast(), and Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition Unit.cpp:20889
uint32 GetDisplayId() const
Definition Unit.h:1887

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
20890{
20891 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
20892 {
20893 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
20894 {
20895 return DisplayRace(displayExtra->DisplayRaceID);
20896 }
20897 }
20898 return DisplayRace::None;
20899}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition SharedDefines.h:111
Definition DBCStructure.h:739

References None, sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5968{
5969 static const AuraType diseaseAuraTypes[] =
5970 {
5974 };
5975
5976 uint32 dots = 0;
5977 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5978 {
5979 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5980 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5981 {
5982 // Get auras by caster
5983 if ((*i)->GetCasterGUID() == casterGUID)
5984 ++dots;
5985 }
5986 }
5987 return dots;
5988}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6229{
6230 if (m_dynObj.empty())
6231 return nullptr;
6232 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6233 {
6234 DynamicObject* dynObj = *i;
6235 if (dynObj->GetSpellId() == spellId)
6236 return dynObj;
6237 }
6238 return nullptr;
6239}
Definition DynamicObject.h:35
uint32 GetSpellId() const
Definition DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), WorldSession::HandleFarSightOpcode(), and boss_akilzon::JustEngagedWith().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2141{
2142 float victimResistance = float(victim->GetResistance(schoolMask));
2143 if (owner)
2144 {
2145 // Xinef: pets inherit 100% of masters penetration
2146 // Xinef: excluding traps
2147 Player const* player = owner->GetSpellModOwner();
2148 if (player && owner->GetEntry() != WORLD_TRIGGER)
2149 {
2150 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2151 victimResistance -= float(player->GetSpellPenetrationItemMod());
2152 }
2153 else
2154 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2155 }
2156
2157 victimResistance = std::max(victimResistance, 0.0f);
2158 if (owner)
2159 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2160
2161 static uint32 const BOSS_LEVEL = 83;
2162 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2163 uint32 level = victim->GetLevel();
2164 float resistanceConstant = 0.0f;
2165
2166 if (level == BOSS_LEVEL)
2167 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2168 else
2169 resistanceConstant = level * 5.0f;
2170
2171 return victimResistance / (victimResistance + resistanceConstant);
2172}
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1978

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10259{
10260 // always neutral when no template entry found
10261 if (!factionTemplateEntry)
10262 return REP_NEUTRAL;
10263
10264 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10265 if (!targetFactionTemplateEntry)
10266 return REP_NEUTRAL;
10267
10268 // xinef: check forced reputation for self also
10269 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10270 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10271 return *repRank;
10272
10273 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10274 {
10275 // check contested flags
10276 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10277 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10278 return REP_HOSTILE;
10279 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10280 return *repRank;
10281 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10282 {
10283 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10284 {
10285 if (factionEntry->CanHaveReputation())
10286 {
10287 // CvP case - check reputation, don't allow state higher than neutral when at war
10288 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10289 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10290 repRank = std::min(REP_NEUTRAL, repRank);
10291 return repRank;
10292 }
10293 }
10294 }
10295 }
10296
10297 // common faction based check
10298 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10299 return REP_HOSTILE;
10300 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10301 return REP_FRIENDLY;
10302 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10303 return REP_FRIENDLY;
10304 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10305 return REP_HOSTILE;
10306 // neutral by default
10307 return REP_NEUTRAL;
10308}
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition DBCEnums.h:331
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:477
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition UnitDefines.h:291
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:951

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10109{
10110 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10111 if (!entry)
10112 {
10113 static ObjectGuid guid; // prevent repeating spam same faction problem
10114
10115 if (GetGUID() != guid)
10116 {
10117 if (Player const* player = ToPlayer())
10118 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10119 else if (Creature const* creature = ToCreature())
10120 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10121 else
10122 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10123
10124 guid = GetGUID();
10125 }
10126 }
10127 return entry;
10128}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition Object.h:128
uint32 GetFaction() const
Definition Unit.h:801
std::string const & GetName() const
Definition Object.h:525

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), npc_necrotic_shard::DamageTaken(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), PatchValuesUpdate(), and RespondsToCallForHelp().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11175{
11176 // Sequence: charmed, pet, other guardians
11177 Unit* unit = GetCharm();
11178 if (!unit)
11179 if (ObjectGuid guid = GetMinionGUID())
11180 unit = ObjectAccessor::GetUnit(*this, guid);
11181
11182 return unit;
11183}
ObjectGuid GetMinionGUID() const
Definition Unit.h:672

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstCurrentCastingSpell()

Spell * Unit::GetFirstCurrentCastingSpell ( ) const
4205{
4206 for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
4207 if (m_currentSpells[i] && m_currentSpells[i]->GetCastTimeRemaining() > 0)
4208 return m_currentSpells[i];
4209
4210 return nullptr;
4211}

References CURRENT_MAX_SPELL, and m_currentSpells.

Referenced by ChaseMovementGenerator< T >::DoUpdate().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10736{
10737 if (ObjectGuid pet_guid = GetMinionGUID())
10738 {
10739 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10740 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10741 return (Minion*)pet;
10742
10743 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10744 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10745 }
10746
10747 return nullptr;
10748}
void SetMinionGUID(ObjectGuid guid)
Definition Unit.h:673
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition ObjectAccessor.cpp:234

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6270{
6271 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6272 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6273 if (go->GetSpellId() == spellId)
6274 return go;
6275
6276 return nullptr;
6277}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10751{
10752 if (ObjectGuid pet_guid = GetPetGUID())
10753 {
10754 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10755 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10756 return (Guardian*)pet;
10757
10758 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10759 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10760 }
10761
10762 return nullptr;
10763}
#define LOG_FATAL(filterType__,...)
Definition Log.h:154
Definition TemporarySummon.h:96
void SetPetGUID(ObjectGuid guid)
Definition Unit.h:677
ObjectGuid GetPetGUID() const
Definition Unit.h:678

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_dark_fiend::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), spell_illidari_council_empyreal_balance::HandleAfterCast(), spell_illidari_council_empyreal_equivalency::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14229{
14230 int32 gain = 0;
14231
14232 if (dVal == 0)
14233 return 0;
14234
14235 int32 curHealth = (int32)GetHealth();
14236
14237 int32 val = dVal + curHealth;
14238 if (val <= 0)
14239 {
14240 return -curHealth;
14241 }
14242
14243 int32 maxHealth = (int32)GetMaxHealth();
14244
14245 if (val < maxHealth)
14246 gain = dVal;
14247 else if (curHealth != maxHealth)
14248 gain = maxHealth - curHealth;
14249
14250 return gain;
14251}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1522{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
912{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
949{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), CreateTamedPetFrom(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11119{
11120 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11121 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11122 return victim;
11123
11125 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11126 {
11127 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11128 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11129 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11130 && _IsValidAttackTarget(magnet, spellInfo)
11131 /*&& IsWithinLOSInMap(magnet)*/)
11132 {
11133 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11134 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11135
11136 if (magnet->IsTotem())
11137 {
11138 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11139 if (spellInfo->Speed > 0.0f)
11140 {
11141 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11142 if (dist < 5.0f)
11143 dist = 5.0f;
11144 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11145 }
11146
11147 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11148 }
11149
11150 return magnet;
11151 }
11152 }
11153 return victim;
11154}
@ SPELL_ATTR1_NO_REDIRECTION
Definition SharedDefines.h:433
@ SPELL_ATTR0_IS_ABILITY
Definition SharedDefines.h:397
@ SPELL_AURA_SPELL_MAGNET
Definition SpellAuraDefines.h:159
Definition TotemAI.h:47
Definition Unit.h:2236
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition Unit.cpp:13982
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1250

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), npc_dark_fiend::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), spell_illidari_council_empyreal_balance::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), npc_necrotic_shard::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
6050{
6051 int32 modifier = 0;
6052
6053 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6054 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6055 if ((*i)->GetAmount() < modifier)
6056 modifier = (*i)->GetAmount();
6057
6058 return modifier;
6059}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6205{
6206 int32 modifier = 0;
6207
6208 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6209 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6210 {
6211 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6212 modifier = (*i)->GetAmount();
6213 }
6214
6215 return modifier;
6216}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6101{
6102 int32 modifier = 0;
6103
6104 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6105 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6106 {
6107 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
6108 modifier = (*i)->GetAmount();
6109 }
6110
6111 return modifier;
6112}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6153{
6154 int32 modifier = 0;
6155
6156 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6157 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6158 {
6159 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6160 modifier = (*i)->GetAmount();
6161 }
6162
6163 return modifier;
6164}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
6036{
6037 int32 modifier = 0;
6038
6039 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6040 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6041 {
6042 if ((*i)->GetAmount() > modifier)
6043 modifier = (*i)->GetAmount();
6044 }
6045
6046 return modifier;
6047}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6191{
6192 int32 modifier = 0;
6193
6194 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6195 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6196 {
6197 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6198 modifier = (*i)->GetAmount();
6199 }
6200
6201 return modifier;
6202}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
6087{
6088 int32 modifier = 0;
6089
6090 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6091 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6092 {
6093 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
6094 modifier = (*i)->GetAmount();
6095 }
6096
6097 return modifier;
6098}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6139{
6140 int32 modifier = 0;
6141
6142 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6143 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6144 {
6145 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
6146 modifier = (*i)->GetAmount();
6147 }
6148
6149 return modifier;
6150}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1059{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1132{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1027

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3163{
3164 if (!spell)
3165 return 0;
3166 int32 resist_mech = 0;
3167 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3168 {
3169 if (!spell->Effects[eff].IsEffect())
3170 break;
3171 int32 effect_mech = spell->GetEffectMechanic(eff);
3172 if (effect_mech)
3173 {
3175 if (resist_mech < temp)
3176 resist_mech = temp;
3177 }
3178 }
3179 return resist_mech;
3180}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6114

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2699{
2700 if (!attacker)
2701 {
2702 return false;
2703 }
2704
2705 AttackerSet attackers = getAttackers();
2706
2707 if (attackers.size() <= 1) // if the attackers are not more than one
2708 {
2709 return false;
2710 }
2711
2712 float meleeReach = GetExactDist2d(attacker);
2713 if (meleeReach <= 0)
2714 {
2715 return false;
2716 }
2717
2718 float minAngle = 0;
2719 Unit *refUnit = nullptr;
2720 uint32 validAttackers = 0;
2721
2722 double attackerSize = attacker->GetCollisionRadius();
2723
2724 for (auto const& otherAttacker: attackers)
2725 {
2726 // if the otherAttacker is not valid, skip
2727 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2728 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2729 {
2730 continue;
2731 }
2732
2733 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2734 if (minAngle == 0 || curretAngle < minAngle)
2735 {
2736 minAngle = curretAngle;
2737 refUnit = otherAttacker;
2738 }
2739
2740 validAttackers++;
2741 }
2742
2743 if (!validAttackers || !refUnit)
2744 {
2745 return false;
2746 }
2747
2748 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2749 float requiredAngle = atan(contactDist / meleeReach);
2750 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2751
2752 // in instance: the more attacker there are, the higher will be the tollerance
2753 // outside: creatures should not intersecate
2754 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2755
2756 if (attackersAngle > angleTollerance)
2757 {
2758 return false;
2759 }
2760
2761 double angle = atan(contactDist / meleeReach);
2762
2763 float angularRadius = frand(0.1f, 0.3f) + angle;
2764 int8 direction = (urand(0, 1) ? -1 : 1);
2765 float currentAngle = GetAngle(refUnit);
2766 float absAngle = currentAngle + angularRadius * direction;
2767
2768 float x, y, z;
2769 float distance = meleeReach - GetObjectSize();
2770 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2771
2772 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2773 {
2774 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2775
2776 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2777 {
2778 return false;
2779 }
2780 }
2781
2782 pos.Relocate(x, y, z);
2783
2784 return true;
2785}
std::int8_t int8
Definition Define.h:105
float frand(float min, float max)
Definition Random.cpp:57
bool IsDungeon() const
Definition Map.h:292
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition Unit.cpp:20964
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:622
AttackerSet const & getAttackers() const
Definition Unit.h:845
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition Object.cpp:2619
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1201{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition Unit.cpp:19295

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11157{
11159 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11160 {
11161 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11162 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11163 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11164 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11165 if (roll_chance_i((*i)->GetAmount()))
11166 {
11167 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11168 return magnet;
11169 }
11170 }
11171 return victim;
11172}
bool roll_chance_i(int chance)
Definition Random.h:63
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
685{
686 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
687 return std::max(range, NOMINAL_MELEE_RANGE);
688}
#define NOMINAL_MELEE_RANGE
Definition ObjectDefines.h:47
float GetCombatReach() const override
Definition Unit.h:822

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
823{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition ObjectDefines.h:46

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
)
19302{
19303 // Hardcoded cases
19304 switch (spellId)
19305 {
19306 case 7090: // Bear form
19307 return 29414;
19308 case 35200: // Roc form
19309 return 4877;
19310 default:
19311 break;
19312 }
19313
19314 if (IsPlayer())
19315 {
19316 if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer()))
19317 return ModelId;
19318 }
19319
19320 uint32 modelid = 0;
19321 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19322 if (formEntry && formEntry->modelID_A)
19323 {
19324 // Take the alliance modelid as default
19325 if (!IsPlayer())
19326 return formEntry->modelID_A;
19327 else
19328 {
19330 modelid = formEntry->modelID_A;
19331 else
19332 modelid = formEntry->modelID_H;
19333
19334 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19335 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19336 modelid = formEntry->modelID_A;
19337 }
19338 }
19339
19340 return modelid;
19341}
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ TEAM_HORDE
Definition SharedDefines.h:772
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5866
uint8 getRace(bool original=false) const
Definition Unit.cpp:20870
uint32 modelID_H
Definition DBCStructure.h:1828
uint32 modelID_A
Definition DBCStructure.h:1827

References getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, sObjectMgr, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15394{
15395 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15396 {
15397 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15398 return 0.0f;
15399 }
15400
15401 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15402 return 0.0f;
15403
15404 return m_auraModifiersGroup[unitMod][modifierType];
15405}
@ MODIFIER_TYPE_END
Definition Unit.h:131

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1673{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), Creature::CanCreatureAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_singularity::FindAndFollowTarget(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::boss_volkhanAI::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), spell_chapter2_persuasive_strike::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_felmyst::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_demonic_vapor::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), Creature::IsUpdateNeeded(), JumpTo(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_cyclone::JustEngagedWith(), npc_sunblade_scout::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), npc_harrison_jones::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), boss_felblood_kaelthas::Reset(), npc_acherus_necromancer::npc_acherus_necromancerAI::Reset(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), boss_taldaram::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnAnArenaNPC(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), boss_attumen::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_forest_frog::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), FollowerAI::StartFollow(), boss_felmyst::StartIntro(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1674{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1885{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1006{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11214{
11215 Player* player = nullptr;
11216 if (IsPlayer())
11217 player = ToPlayer();
11218 // Should we enable this also for charmed units?
11219 else if (IsCreature() && IsPet())
11220 player = GetOwner()->ToPlayer();
11221
11222 if (!player)
11223 return nullptr;
11224 Group* group = player->GetGroup();
11225 // When there is no group check pet presence
11226 if (!group)
11227 {
11228 // We are pet now, return owner
11229 if (player != this)
11230 return IsWithinDistInMap(player, radius) ? player : nullptr;
11231 Unit* pet = GetGuardianPet();
11232 // No pet, no group, nothing to return
11233 if (!pet)
11234 return nullptr;
11235 // We are owner now, return pet
11236 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11237 }
11238
11239 std::vector<Unit*> nearMembers;
11240 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11241 nearMembers.reserve(group->GetMembersCount() * 2);
11242
11243 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11244 if (Player* Target = itr->GetSource())
11245 {
11246 if (Target != this && !IsWithinDistInMap(Target, radius))
11247 continue;
11248
11249 // IsHostileTo check duel and controlled by enemy
11250 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11251 nearMembers.push_back(Target);
11252
11253 // Push player's pet to vector
11254 if (Unit* pet = Target->GetGuardianPet())
11255 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11256 nearMembers.push_back(pet);
11257 }
11258
11259 if (nearMembers.empty())
11260 return nullptr;
11261
11262 uint32 randTarget = urand(0, nearMembers.size() - 1);
11263 return nearMembers[randTarget];
11264}
Definition GroupReference.h:27
Definition Group.h:169
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
Group * GetGroup()
Definition Player.h:2478
Guardian * GetGuardianPet() const
Definition Unit.cpp:10750
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1326

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
805{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4830{
4831 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4832 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4833 {
4834 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4835 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4836 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4837 && (!except || except != itr->second))
4838 {
4839 return itr->second;
4840 }
4841 }
4842 return nullptr;
4843}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition Unit.h:626

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1297{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10700{
10701 if (ObjectGuid ownerGUID = GetOwnerGUID())
10702 return ObjectAccessor::GetUnit(*this, ownerGUID);
10703
10704 return nullptr;
10705}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SendPetTalk(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), spell_item_fetch_ball::SelectTarget(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
18921{
18922 Unit* owner = GetCharmerOrOwnerOrSelf();
18923 Group* group = nullptr;
18924 if (owner->IsPlayer())
18925 group = owner->ToPlayer()->GetGroup();
18926
18927 if (group)
18928 {
18929 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18930
18931 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18932 {
18933 Player* Target = itr->GetSource();
18934
18935 // IsHostileTo check duel and controlled by enemy
18936 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18937 {
18938 if (Target->IsAlive())
18939 TagUnitMap.push_back(Target);
18940
18941 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18942 {
18943 if (Unit* pet = *iterator)
18944 if (pet->IsGuardian() && pet->IsAlive())
18945 TagUnitMap.push_back(pet);
18946 }
18947 }
18948 }
18949 }
18950 else
18951 {
18952 if (owner->IsAlive())
18953 TagUnitMap.push_back(owner);
18954
18955 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18956 {
18957 if (Unit* pet = *itr)
18958 if (pet->IsGuardian() && pet->IsAlive())
18959 TagUnitMap.push_back(pet);
18960 }
18961 }
18962}
uint8 GetSubGroup() const
Definition Player.h:2482

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19140{
19141 uint32 currentPhase = 0;
19143 if (!phases.empty())
19144 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19145 currentPhase |= (*itr)->GetMiscValue();
19146
19147 return currentPhase;
19148}
@ SPELL_AURA_PHASE
Definition SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1005{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1058{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), boss_shade_of_aran::JustEngagedWith(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1060{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1059
uint32 GetPower(Powers power) const
Definition Unit.h:1058

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15512{
15513 switch (unitMod)
15514 {
15515 case UNIT_MOD_RAGE:
15516 return POWER_RAGE;
15517 case UNIT_MOD_FOCUS:
15518 return POWER_FOCUS;
15519 case UNIT_MOD_ENERGY:
15520 return POWER_ENERGY;
15521 case UNIT_MOD_HAPPINESS:
15522 return POWER_HAPPINESS;
15523 case UNIT_MOD_RUNE:
15524 return POWER_RUNE;
15526 return POWER_RUNIC_POWER;
15527 default:
15528 case UNIT_MOD_MANA:
15529 return POWER_MANA;
15530 }
15531}
@ UNIT_MOD_RUNE
Definition Unit.h:155
@ UNIT_MOD_ENERGY
Definition Unit.h:153
@ UNIT_MOD_FOCUS
Definition Unit.h:152
@ UNIT_MOD_HAPPINESS
Definition Unit.h:154
@ UNIT_MOD_MANA
Definition Unit.h:150
@ UNIT_MOD_RAGE
Definition Unit.h:151
@ UNIT_MOD_RUNIC_POWER
Definition Unit.h:156

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13550{
13551 // proc per minute chance calculation
13552 if (PPM <= 0)
13553 return 0.0f;
13554
13555 // Apply chance modifer aura
13556 if (spellProto)
13557 if (Player* modOwner = GetSpellModOwner())
13558 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13559
13560 return (WeaponSpeed * PPM) / 600.0f; // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13561}
@ SPELLMOD_PROC_PER_MINUTE
Definition SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16601{
16602 // use provided list of auras which can proc
16603 if (procAuras)
16604 {
16605 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16606 {
16607 ASSERT((*itr)->GetTarget() == this);
16608 if (!(*itr)->GetRemoveMode())
16609 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16610 {
16611 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16612 aurasTriggeringProc.push_back(*itr);
16613 }
16614 }
16615 }
16616 // or generate one on our own
16617 else
16618 {
16619 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16620 {
16621 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16622 {
16623 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16624 aurasTriggeringProc.push_back(itr->second);
16625 }
16626 }
16627 }
16628}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
20871{
20872 if (IsPlayer())
20873 {
20874 if (original)
20875 return m_realRace;
20876 else
20877 return m_race;
20878 }
20879
20881}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CheckSkillLearnedBySpell(), Player::CreateCorpse(), GetModelForForm(), ObjectMgr::GetModelForShapeshift(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), InstanceScript::OnPlayerLeave(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
716{
717 float combat_reach = GetCombatReach();
718 if (combat_reach < 0.1f) // sometimes bugged for players
719 combat_reach = DEFAULT_COMBAT_REACH;
720
721 uint32 attacker_number = getAttackers().size();
722 if (attacker_number > 0)
723 --attacker_number;
724 Creature const* c = obj->ToCreature();
725 if (c)
726 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
727 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
728
729 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
730 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
731
732 // pussywizard
733 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
734 {
735 x = this->GetPositionX();
736 y = this->GetPositionY();
737 z = this->GetPositionZ();
738 obj->UpdateAllowedPositionZ(x, y, z);
739 }
740 float maxDist = GetMeleeRange(obj);
741 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
742 {
743 if (force)
744 {
745 x = this->GetPositionX();
746 y = this->GetPositionY();
747 z = this->GetPositionZ();
748 return true;
749 }
750 return false;
751 }
752 return true;
753}
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:45
bool IsDungeonBoss() const
Definition Creature.cpp:3175
bool isControlled() const
Definition Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:20970
float GetMeleeRange(Unit const *target) const
Definition Unit.cpp:684
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition Object.cpp:1331
float GetExactDistSq(float x, float y, float z) const
Definition Position.h:174

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10139{
10140 // always friendly to self
10141 if (this == target)
10142 return REP_FRIENDLY;
10143
10144 // always friendly to charmer or owner
10146 return REP_FRIENDLY;
10147
10148 Player const* selfPlayerOwner = GetAffectingPlayer();
10149 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10150
10151 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10152 if (selfPlayerOwner)
10153 {
10154 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10155 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10156 return *repRank;
10157 }
10158 else if (targetPlayerOwner)
10159 {
10160 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10161 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10162 return *repRank;
10163 }
10164
10166 {
10167 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10168 {
10169 if (selfPlayerOwner && targetPlayerOwner)
10170 {
10171 // always friendly to other unit controlled by player, or to the player himself
10172 if (selfPlayerOwner == targetPlayerOwner)
10173 return REP_FRIENDLY;
10174
10175 // duel - always hostile to opponent
10176 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10177 return REP_HOSTILE;
10178
10179 // same group - checks dependant only on our faction - skip FFA_PVP for example
10180 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10181 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10182 // however client seems to allow mixed group parties, because in 13850 client it works like:
10183 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10184 }
10185
10186 // check FFA_PVP
10187 if (IsFFAPvP() && target->IsFFAPvP())
10188 return REP_HOSTILE;
10189
10190 if (selfPlayerOwner)
10191 {
10192 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10193 {
10194 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10195 return *repRank;
10196 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10197 {
10198 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10199 {
10200 if (targetFactionEntry->CanHaveReputation())
10201 {
10202 // check contested flags
10203 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10204 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10205 return REP_HOSTILE;
10206
10207 // if faction has reputation, hostile state depends only from AtWar state
10208 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10209 return REP_HOSTILE;
10210 return REP_FRIENDLY;
10211 }
10212 }
10213 }
10214 }
10215 }
10216 }
10217 }
10218
10219 ReputationRank repRank = REP_HATED;
10220 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10221 {
10222 return ReputationRank(repRank);
10223 }
10224
10225 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10226 if (checkOriginalFaction)
10227 {
10228 if (IsPlayer())
10229 {
10230 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10231 {
10232 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10233 }
10234 }
10235 else
10236 {
10237 Unit* owner = GetOwner();
10238 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10239 {
10240 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10241 }
10242 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10243 {
10244 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10245 }
10246 }
10247 }
10248
10249 if (!factionTemplateEntry)
10250 {
10251 factionTemplateEntry = GetFactionTemplateEntry();
10252 }
10253
10254 // do checks dependant only on our faction
10255 return GetFactionReactionTo(factionTemplateEntry, target);
10256}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1116
bool IsAtWar(uint32 faction_id) const
Definition ReputationMgr.cpp:55
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition Unit.cpp:10258
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:18898
Definition DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition ThreatMgr.h:299

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20186{
20187 int32 resist = -1;
20188 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20189 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20190 resist = int32(GetResistance(SpellSchools(i)));
20191
20192 // resist value will never be negative here
20193 return uint32(resist);
20194}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1121{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition UnitDefines.h:125

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1100 {
1101 uint32 value = GetShieldBlockValue();
1102 if (value >= hard_cap)
1103 {
1104 value = (soft_cap + hard_cap) / 2;
1105 }
1106 else if (value > soft_cap)
1107 {
1108 value = soft_cap + ((value - soft_cap) / 2);
1109 }
1110
1111 return value;
1112 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1353{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

float Unit::GetSpeed ( UnitMoveType  mtype) const

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15253{
15254 if (!spellInfo->RangeEntry)
15255 {
15256 return 0;
15257 }
15258
15259 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15260 {
15261 return spellInfo->GetMaxRange();
15262 }
15263
15264 if (!target)
15265 {
15266 return spellInfo->GetMaxRange(true);
15267 }
15268
15269 return spellInfo->GetMaxRange(!IsHostileTo(target));
15270}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15273{
15274 if (!spellInfo->RangeEntry)
15275 {
15276 return 0;
15277 }
15278
15279 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15280 {
15281 return spellInfo->GetMinRange();
15282 }
15283
15284 return spellInfo->GetMinRange(!IsHostileTo(target));
15285}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16665{
16666 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16667 {
16668 return player;
16669 }
16670
16671 if (Unit* owner = GetOwner())
16672 {
16673 if (Player* player = owner->ToPlayer())
16674 {
16675 return player;
16676 }
16677 }
16678
16679 // Special handling for Eye of Kilrogg
16681 {
16682 if (TempSummon const* tempSummon = ToTempSummon())
16683 {
16684 if (Unit* summoner = tempSummon->GetSummonerUnit())
16685 {
16686 return summoner->ToPlayer();
16687 }
16688 }
16689 }
16690
16691 return nullptr;
16692}
@ NPC_EYE_OF_KILROGG
Definition PetDefines.h:101
Definition TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), SpellHealingBonusTaken(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15451{
15453
15454 switch (unitMod)
15455 {
15457 school = SPELL_SCHOOL_HOLY;
15458 break;
15460 school = SPELL_SCHOOL_FIRE;
15461 break;
15463 school = SPELL_SCHOOL_NATURE;
15464 break;
15466 school = SPELL_SCHOOL_FROST;
15467 break;
15469 school = SPELL_SCHOOL_SHADOW;
15470 break;
15472 school = SPELL_SCHOOL_ARCANE;
15473 break;
15474
15475 default:
15476 break;
15477 }
15478
15479 return school;
15480}
@ SPELL_SCHOOL_SHADOW
Definition SharedDefines.h:299
@ SPELL_SCHOOL_NATURE
Definition SharedDefines.h:297
@ SPELL_SCHOOL_FROST
Definition SharedDefines.h:298
@ SPELL_SCHOOL_ARCANE
Definition SharedDefines.h:300
@ SPELL_SCHOOL_FIRE
Definition SharedDefines.h:296
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:295
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:162
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:161
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:158
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:163
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:159
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:160

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15483{
15484 Stats stat = STAT_STRENGTH;
15485
15486 switch (unitMod)
15487 {
15489 stat = STAT_STRENGTH;
15490 break;
15492 stat = STAT_AGILITY;
15493 break;
15495 stat = STAT_STAMINA;
15496 break;
15498 stat = STAT_INTELLECT;
15499 break;
15501 stat = STAT_SPIRIT;
15502 break;
15503
15504 default:
15505 break;
15506 }
15507
15508 return stat;
15509}
Stats
Definition SharedDefines.h:268
@ STAT_SPIRIT
Definition SharedDefines.h:273
@ STAT_INTELLECT
Definition SharedDefines.h:272
@ STAT_AGILITY
Definition SharedDefines.h:270
@ STAT_STRENGTH
Definition SharedDefines.h:269
@ STAT_STAMINA
Definition SharedDefines.h:271
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:147
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:148
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:144
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:145
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:146

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
898{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_talon_king_ikiss::JustEngagedWith(), boss_blackheart_the_inciter::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
899{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15534{
15535 if (attType == RANGED_ATTACK)
15536 {
15538 if (victim)
15539 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15540
15541 if (ap < 0)
15542 return 0.0f;
15544 }
15545 else
15546 {
15548 if (victim)
15549 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15550
15551 if (ap < 0)
15552 return 0.0f;
15554 }
15555}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:288

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5991{
5992 int32 modifier = 0;
5993 int32 areaModifier = 0;
5994
5995 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5996 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5997 {
5998 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5999 {
6000 if (areaModifier < (*i)->GetAmount())
6001 areaModifier = (*i)->GetAmount();
6002 }
6003 else
6004 modifier += (*i)->GetAmount();
6005 }
6006
6007 return modifier + areaModifier;
6008}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6167{
6168 int32 modifier = 0;
6169
6170 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6171 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6172 if ((*i)->IsAffectedOnSpell(affectedSpell))
6173 modifier += (*i)->GetAmount();
6174
6175 return modifier;
6176}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6062{
6063 int32 modifier = 0;
6064
6065 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6066 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6067 {
6068 if ((*i)->GetMiscValue()& misc_mask)
6069 modifier += (*i)->GetAmount();
6070 }
6071 return modifier;
6072}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6115{
6116 int32 modifier = 0;
6117
6118 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6119 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6120 if ((*i)->GetMiscValue() == misc_value)
6121 modifier += (*i)->GetAmount();
6122
6123 return modifier;
6124}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15424{
15425 if (unitMod >= UNIT_MOD_END)
15426 {
15427 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15428 return 0.0f;
15429 }
15430
15431 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15432 return 0.0f;
15433
15434 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15435 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15436 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15437 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15438
15439 return value;
15440}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
6025{
6026 float multiplier = 1.0f;
6027
6028 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6029 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6030 AddPct(multiplier, (*i)->GetAmount());
6031
6032 return multiplier;
6033}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6179{
6180 float multiplier = 1.0f;
6181
6182 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6183 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6184 if ((*i)->IsAffectedOnSpell(affectedSpell))
6185 AddPct(multiplier, (*i)->GetAmount());
6186
6187 return multiplier;
6188}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6075{
6076 float multiplier = 1.0f;
6077
6078 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6079 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6080 if (((*i)->GetMiscValue() & misc_mask))
6081 AddPct(multiplier, (*i)->GetAmount());
6082
6083 return multiplier;
6084}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6127{
6128 float multiplier = 1.0f;
6129
6130 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6131 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6132 if ((*i)->GetMiscValue() == misc_value)
6133 AddPct(multiplier, (*i)->GetAmount());
6134
6135 return multiplier;
6136}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15408{
15409 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15410
15411 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15412 return 0.0f;
15413
15414 // value = ((base_value * base_pct) + total_value) * total_pct
15415 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15416 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15417 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15418 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15419
15420 return value;
15421}
UnitMods
Definition Unit.h:143
@ UNIT_MOD_STAT_START
Definition Unit.h:171
float GetCreateStat(Stats stat) const
Definition Unit.h:1002

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3732{
3733 if (Player const* player = ToPlayer())
3734 {
3735 if (player->CanBlock())
3736 {
3737 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3738 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3740 }
3741 // is player but has no block ability or no not broken shield equipped
3742 return 0.0f;
3743 }
3744 else
3745 {
3746 if (ToCreature()->IsTotem())
3747 return 0.0f;
3748 else
3749 {
3750 float block = 5.0f;
3752 return block > 0.0f ? block : 0.0f;
3753 }
3754 }
3755}
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:687
#define INVENTORY_SLOT_BAG_0
Definition Player.h:666
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
bool IsBroken() const
Definition Item.h:257
uint32 Block
Definition ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3758{
3759 float crit;
3760
3761 if (IsPlayer())
3762 {
3763 switch (attackType)
3764 {
3765 case BASE_ATTACK:
3767 break;
3768 case OFF_ATTACK:
3770 break;
3771 case RANGED_ATTACK:
3773 break;
3774 // Just for good manner
3775 default:
3776 crit = 0.0f;
3777 break;
3778 }
3779 }
3780 else
3781 {
3782 crit = 5.0f;
3785 }
3786
3787 // flat aura mods
3788 if (attackType == RANGED_ATTACK)
3789 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3790 else
3791 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3792
3793 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3794 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3795 {
3796 if (GetGUID() != (*i)->GetCasterGUID())
3797 continue;
3798
3799 crit += (*i)->GetAmount();
3800 }
3801
3802 // reduce crit chance from Rating for players
3803 if (attackType != RANGED_ATTACK)
3804 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3805 else
3806 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3807
3808 // Apply crit chance from defence skill
3809 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3810
3811 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3812 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3813
3814 if (crit < 0.0f)
3815 crit = 0.0f;
3816 return crit;
3817}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1132

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3670{
3671 if (IsPlayer())
3672 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3673 else
3674 {
3675 if (ToCreature()->IsTotem())
3676 return 0.0f;
3677 else
3678 {
3679 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3681 return dodge > 0.0f ? dodge : 0.0f;
3682 }
3683 }
3684}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
float GetRealDodge() const
Definition Player.h:2617

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

UnitFlags2
Definition UnitDefines.h:287
@ UNIT_FIELD_FLAGS_2
Definition UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1114{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3717{
3718 float miss_chance = 5.00f;
3719
3720 if (Player const* player = ToPlayer())
3721 miss_chance += player->GetMissPercentageFromDefence();
3722
3723 if (attType == RANGED_ATTACK)
3725 else
3727
3728 return miss_chance;
3729}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3687{
3688 float chance = 0.0f;
3689
3690 if (Player const* player = ToPlayer())
3691 {
3692 if (player->CanParry())
3693 {
3694 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3695 if (!tmpitem)
3696 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3697
3698 if (tmpitem)
3699 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3700 }
3701 }
3702 else if (IsCreature())
3703 {
3704 if (ToCreature()->isWorldBoss())
3705 chance = 13.4f; // + 0.6 by skill diff
3707 chance = 5.0f;
3708
3709 // Xinef: if aura is present, type should not matter
3711 }
3712
3713 return chance > 0.0f ? chance : 0.0f;
3714}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
698{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1839{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1838{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), Object::BuildMovementUpdate(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), MotionTransport::DelayedTeleportTransport(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
848{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), Attack(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_isalien::DamageTaken(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_attumen::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_shade_of_aran::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_kiljaeden::ScheduleBasicAbilities(), npc_sunblade_scout::ScheduleCombat(), npc_amanishi_scout::ScheduleCombat(), boss_taldaram::ScheduleCombatEvents(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), SmartAI::SetCombatMove(), SetConfused(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21032{
21033 if (slot >= MAX_EQUIPMENT_ITEMS)
21034 return 0;
21035
21037}
#define MAX_EQUIPMENT_ITEMS
Definition CreatureData.h:35
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition UpdateFields.h:116

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1460 {
1461 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1462 if (itr != m_visibleAuras.end())
1463 return itr->second;
1464 return nullptr;
1465 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15558{
15559 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15560 return 0.0f;
15561
15562 return m_weaponDamage[attType][type][damageIndex];
15563}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13539{
13540 // normalized proc chance for weapon attack speed
13541 // (odd formula...)
13543 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13545 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13546 return 0;
13547}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3820{
3821 uint32 value = 0;
3822 if (Player const* player = ToPlayer())
3823 {
3824 Item* item = player->GetWeaponForAttack(attType, true);
3825
3826 // feral or unarmed skill only for base attack
3827 if (attType != BASE_ATTACK && !item)
3828 return 0;
3829
3830 if (IsInFeralForm())
3831 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3832
3833 // weapon skill or (unarmed for base attack)
3834 uint32 skill = SKILL_UNARMED;
3835 if (item)
3836 skill = item->GetSkill();
3837
3838 // in PvP use full skill instead current skill value
3839 value = (target && target->IsControlledByPlayer())
3840 ? player->GetMaxSkillValue(skill)
3841 : player->GetSkillValue(skill);
3842 // Modify value from ratings
3843 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3844 switch (attType)
3845 {
3846 case BASE_ATTACK:
3847 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3848 break;
3849 case OFF_ATTACK:
3850 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3851 break;
3852 case RANGED_ATTACK:
3853 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3854 break;
3855 default:
3856 break;
3857 }
3858 }
3859 else
3860 value = GetUnitMeleeSkill(target);
3861 return value;
3862}
@ SKILL_UNARMED
Definition SharedDefines.h:3157
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:240
@ CR_WEAPON_SKILL
Definition Unit.h:218
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:239
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:238
uint32 GetSkill()
Definition Item.cpp:555
bool IsInFeralForm() const
Definition Unit.h:1873

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8816{
8817 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8818
8819 switch (dummySpell->SpellFamilyName)
8820 {
8822 switch (dummySpell->Id)
8823 {
8824 // Nevermelting Ice Crystal
8825 case 71564:
8826 RemoveAuraFromStack(71564);
8827 *handled = true;
8828 break;
8829 // Gaseous Bloat
8830 case 70672:
8831 case 72455:
8832 case 72832:
8833 case 72833:
8834 {
8835 if (Unit* caster = triggeredByAura->GetCaster())
8836 if (victim && caster->GetGUID() == victim->GetGUID())
8837 {
8838 *handled = true;
8839 uint32 stack = triggeredByAura->GetStackAmount();
8840 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8841 int32 dmg = 0;
8842 for (uint8 i = 1; i <= stack; ++i)
8843 dmg += mod * i;
8844 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8845 }
8846 break;
8847 }
8848 // Ball of Flames Proc
8849 case 71756:
8850 case 72782:
8851 case 72783:
8852 case 72784:
8853 RemoveAuraFromStack(dummySpell->Id);
8854 *handled = true;
8855 break;
8856 // Discerning Eye of the Beast
8857 case 59915:
8858 {
8859 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8860 *handled = true;
8861 break;
8862 }
8863 // Swift Hand of Justice
8864 case 59906:
8865 {
8866 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8867 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8868 *handled = true;
8869 break;
8870 }
8871 }
8872
8873 break;
8874 case SPELLFAMILY_MAGE:
8875 {
8876 // Combustion
8877 switch (dummySpell->Id)
8878 {
8879 case 11129:
8880 {
8881 *handled = true;
8882 Unit* caster = triggeredByAura->GetCaster();
8883 if (!caster || !damage)
8884 return false;
8885
8886 // last charge and crit
8887 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8888 return true; // charge counting (will removed)
8889
8890 CastSpell(this, 28682, true);
8891
8892 return procEx & PROC_EX_CRITICAL_HIT;
8893 }
8894 // Empowered Fire
8895 case 31656:
8896 case 31657:
8897 case 31658:
8898 {
8899 *handled = true;
8900
8901 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8902 if (!spInfo)
8903 return false;
8904
8905 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8906 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8907 return true;
8908 }
8909 }
8910 break;
8911 }
8913 {
8914 // Blood of the North
8915 // Reaping
8916 // Death Rune Mastery
8917 // xinef: Icon 22 is used for item bonus, skip
8918 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8919 {
8920 *handled = true;
8921 // Convert recently used Blood Rune to Death Rune
8922 if (Player* player = ToPlayer())
8923 {
8924 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8925 return false;
8926
8927 // xinef: not true
8928 //RuneType rune = ToPlayer()->GetLastUsedRune();
8929 // can't proc from death rune use
8930 //if (rune == RUNE_DEATH)
8931 // return false;
8932 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8933 if (!aurEff)
8934 return false;
8935
8936 // Reset amplitude - set death rune remove timer to 30s
8937 aurEff->ResetPeriodic(true);
8938 uint32 runesLeft;
8939
8940 if (dummySpell->SpellIconID == 2622)
8941 runesLeft = 2;
8942 else
8943 runesLeft = 1;
8944
8945 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8946 {
8947 if (dummySpell->SpellIconID == 2622)
8948 {
8949 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8950 player->GetBaseRune(i) == RUNE_BLOOD)
8951 continue;
8952 }
8953 else
8954 {
8955 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8956 player->GetBaseRune(i) != RUNE_BLOOD)
8957 continue;
8958 }
8959 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8960 continue;
8961
8962 --runesLeft;
8963 // Mark aura as used
8964 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8965 }
8966 return true;
8967 }
8968 return false;
8969 }
8970 break;
8971 }
8973 {
8974 switch (dummySpell->Id)
8975 {
8976 // Item - Warrior T10 Protection 4P Bonus
8977 case 70844:
8978 {
8979 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8980 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8981 break;
8982 }
8983 default:
8984 break;
8985 }
8986 break;
8987 }
8988 case SPELLFAMILY_SHAMAN:
8989 {
8990 // Flurry
8991 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8992 {
8993 if (cooldown)
8994 {
8995 if (HasSpellCooldown(dummySpell->Id))
8996 {
8997 *handled = true;
8998 break;
8999 }
9000
9001 AddSpellCooldown(dummySpell->Id, 0, cooldown);
9002 }
9003 }
9004 break;
9005 }
9006 }
9007 return false;
9008}
@ RUNE_DEATH
Definition Player.h:407
@ RUNE_BLOOD
Definition Player.h:404
@ EFFECT_1
Definition SharedDefines.h:32
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3797
@ SPELLFAMILY_GENERIC
Definition SharedDefines.h:3794
@ SPELLFAMILY_WARRIOR
Definition SharedDefines.h:3798
@ SPELLFAMILY_SHAMAN
Definition SharedDefines.h:3805
@ SPELLFAMILY_DEATHKNIGHT
Definition SharedDefines.h:3809
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:175
uint8 GetSpawnMode() const
Definition Map.h:264
virtual bool HasSpellCooldown(uint32) const
Definition Unit.h:1262
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Unit.h:1264
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4994

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17753{
17754 // aura can be deleted at casts
17755 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17756
17757 uint32 damageSpellId;
17758 switch (spellProto->Id)
17759 {
17760 case 57949: // shiver
17761 damageSpellId = 57952;
17762 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17763 break;
17764 case 59978: // shiver
17765 damageSpellId = 59979;
17766 break;
17767 case 43593: // Cold Stare
17768 damageSpellId = 43594;
17769 break;
17770 default:
17771 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17772 return false;
17773 }
17774
17775 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17776
17777 // jumps
17778 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17779
17780 // current aura expire
17781 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17782
17783 // next target selection
17784 if (jumps > 0)
17785 {
17786 if (Unit* caster = triggeredByAura->GetCaster())
17787 {
17788 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17789 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17790 {
17791 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17792 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17793 aura->SetCharges(jumps);
17794 }
17795 }
17796 }
17797
17798 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17799
17800 return true;
17801}
void SetCharges(uint8 charges)
Definition SpellAuras.cpp:952
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition Unit.cpp:11213

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17664{
17665 // aura can be deleted at casts
17666 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17667 int32 heal = triggeredByAura->GetAmount();
17668 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17669
17670 // Currently only Prayer of Mending
17671 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17672 {
17673 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17674 return false;
17675 }
17676
17677 // jumps
17678 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17679
17680 // current aura expire
17681 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17682
17683 // next target selection
17684 if (jumps > 0)
17685 {
17686 if (Unit* caster = triggeredByAura->GetCaster())
17687 {
17688 // smart healing
17689 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17690 std::list<Unit*> nearMembers;
17691
17692 Player* player = nullptr;
17693 if (IsPlayer())
17694 player = ToPlayer();
17695 else if (GetOwner())
17696 player = GetOwner()->ToPlayer();
17697
17698 if (player)
17699 {
17700 Group* group = player->GetGroup();
17701 if (!group)
17702 {
17703 if (player != this)
17704 {
17705 if (IsWithinDistInMap(player, radius))
17706 nearMembers.push_back(player);
17707 }
17708 else if (Unit* pet = GetGuardianPet())
17709 {
17710 if (IsWithinDistInMap(pet, radius))
17711 nearMembers.push_back(pet);
17712 }
17713 }
17714 else
17715 {
17716 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17717 if (Player* Target = itr->GetSource())
17718 {
17719 if (Target != this && !IsWithinDistInMap(Target, radius))
17720 continue;
17721
17722 // IsHostileTo check duel and controlled by enemy
17723 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17724 nearMembers.push_back(Target);
17725
17726 // Push player's pet to vector
17727 if (Unit* pet = Target->GetGuardianPet())
17728 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17729 nearMembers.push_back(pet);
17730 }
17731 }
17732
17733 if (!nearMembers.empty())
17734 {
17735 nearMembers.sort(Acore::HealthPctOrderPred());
17736 if (Unit* target = nearMembers.front())
17737 {
17738 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17739 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17740 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17741 aura->SetCharges(jumps);
17742 }
17743 }
17744 }
17745 }
17746 }
17747
17748 // heal
17749 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17750 return true;
17751}
@ SPELLFAMILY_PRIEST
Definition SharedDefines.h:3800
Definition Unit.h:2210

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6690{
6691 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6692 uint32 effIndex = triggeredByAura->GetEffIndex();
6693 int32 triggerAmount = triggeredByAura->GetAmount();
6694 Spell const* spellProc = eventInfo.GetProcSpell();
6695
6696 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6697 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6698
6699 uint32 triggered_spell_id = 0;
6700 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6701 // otherwise, it's the triggered_spell_id by default
6702 Unit* target = victim;
6703 int32 basepoints0 = 0;
6704 ObjectGuid originalCaster;
6705
6706 switch (dummySpell->SpellFamilyName)
6707 {
6709 {
6710 switch (dummySpell->Id)
6711 {
6712 // Overkill
6713 case 58426:
6714 {
6715 triggered_spell_id = 58427;
6716 break;
6717 }
6718 // Unstable Power
6719 case 24658:
6720 {
6721 if (!procSpell || procSpell->Id == 24659)
6722 return false;
6723 // Need remove one 24659 aura
6724 RemoveAuraFromStack(24659);
6725 return true;
6726 }
6727 // Restless Strength
6728 case 24661:
6729 {
6730 // Need remove one 24662 aura
6731 RemoveAuraFromStack(24662);
6732 return true;
6733 }
6734 // Mark of Malice
6735 case 33493:
6736 {
6737 if (triggeredByAura->GetBase()->GetCharges() > 1)
6738 return true;
6739
6740 target = this;
6741 triggered_spell_id = 33494;
6742 break;
6743 }
6744 // Twisted Reflection (boss spell)
6745 case 21063:
6746 triggered_spell_id = 21064;
6747 break;
6748 // Vampiric Aura (boss spell)
6749 case 38196:
6750 {
6751 basepoints0 = 3 * damage; // 300%
6752 if (basepoints0 < 0)
6753 return false;
6754
6755 triggered_spell_id = 31285;
6756 target = this;
6757 break;
6758 }
6759 // Aura of Madness (Darkmoon Card: Madness trinket)
6760 //=====================================================
6761 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6762 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6763 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6764 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6765 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6766 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6767 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6768 // 41011 Martyr Complex: +35 stamina (All classes)
6769 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6770 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6771 case 39446:
6772 {
6773 if (!IsPlayer() || !IsAlive())
6774 return false;
6775
6776 // Select class defined buff
6777 switch (getClass())
6778 {
6779 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6780 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6781 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6782 cooldown_spell_id = 39511;
6783 break;
6784 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6785 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6786 case CLASS_DEATH_KNIGHT:
6787 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6788 cooldown_spell_id = 39511;
6789 break;
6790 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6791 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6792 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6793 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6794 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6795 cooldown_spell_id = 40999;
6796 break;
6797 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6798 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6799 cooldown_spell_id = 40997;
6800 break;
6801 default:
6802 return false;
6803 }
6804
6805 target = this;
6806 if (roll_chance_i(10))
6807 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6808 break;
6809 }
6810 // Sunwell Exalted Caster Neck (??? neck)
6811 // cast ??? Light's Wrath if Exalted by Aldor
6812 // cast ??? Arcane Bolt if Exalted by Scryers
6813 case 46569:
6814 return false; // old unused version
6815 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6816 // cast 45479 Light's Wrath if Exalted by Aldor
6817 // cast 45429 Arcane Bolt if Exalted by Scryers
6818 case 45481:
6819 {
6820 Player* player = ToPlayer();
6821 if (!player)
6822 return false;
6823
6824 // Get Aldor reputation rank
6825 if (player->GetReputationRank(932) == REP_EXALTED)
6826 {
6827 target = this;
6828 triggered_spell_id = 45479;
6829 break;
6830 }
6831 // Get Scryers reputation rank
6832 if (player->GetReputationRank(934) == REP_EXALTED)
6833 {
6834 // triggered at positive/self casts also, current attack target used then
6835 if (target && IsFriendlyTo(target))
6836 {
6837 target = GetVictim();
6838 if (!target)
6839 {
6840 target = player->GetSelectedUnit();
6841 if (!target)
6842 return false;
6843 }
6844 if (IsFriendlyTo(target))
6845 return false;
6846 }
6847
6848 triggered_spell_id = 45429;
6849 break;
6850 }
6851 return false;
6852 }
6853 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6854 // cast 45480 Light's Strength if Exalted by Aldor
6855 // cast 45428 Arcane Strike if Exalted by Scryers
6856 case 45482:
6857 {
6858 if (!IsPlayer())
6859 return false;
6860
6861 // Get Aldor reputation rank
6862 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6863 {
6864 target = this;
6865 triggered_spell_id = 45480;
6866 break;
6867 }
6868 // Get Scryers reputation rank
6869 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6870 {
6871 triggered_spell_id = 45428;
6872 break;
6873 }
6874 return false;
6875 }
6876 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6877 // cast 45431 Arcane Insight if Exalted by Aldor
6878 // cast 45432 Light's Ward if Exalted by Scryers
6879 case 45483:
6880 {
6881 if (!IsPlayer())
6882 return false;
6883
6884 // Get Aldor reputation rank
6885 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6886 {
6887 target = this;
6888 triggered_spell_id = 45432;
6889 break;
6890 }
6891 // Get Scryers reputation rank
6892 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6893 {
6894 target = this;
6895 triggered_spell_id = 45431;
6896 break;
6897 }
6898 return false;
6899 }
6900 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6901 // cast 45478 Light's Salvation if Exalted by Aldor
6902 // cast 45430 Arcane Surge if Exalted by Scryers
6903 case 45484:
6904 {
6905 if (!IsPlayer())
6906 return false;
6907
6908 // Get Aldor reputation rank
6909 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6910 {
6911 target = this;
6912 triggered_spell_id = 45478;
6913 break;
6914 }
6915 // Get Scryers reputation rank
6916 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6917 {
6918 triggered_spell_id = 45430;
6919 break;
6920 }
6921 return false;
6922 }
6923 // Kill command
6924 case 58914:
6925 {
6926 // Remove aura stack from pet
6927 RemoveAuraFromStack(58914);
6928 Unit* owner = GetOwner();
6929 if (!owner)
6930 return true;
6931 // reduce the owner's aura stack
6932 owner->RemoveAuraFromStack(34027);
6933 return true;
6934 }
6935 // Vampiric Touch (generic, used by some boss)
6936 case 52723:
6937 case 60501:
6938 {
6939 triggered_spell_id = 52724;
6940 basepoints0 = damage / 2;
6941 target = this;
6942 break;
6943 }
6944 // Divine purpose
6945 case 31871:
6946 case 31872:
6947 {
6948 // Roll chane
6949 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6950 return false;
6951
6952 // Remove any stun effect on target
6954 return true;
6955 }
6956 // Glyph of Life Tap
6957 case 63320:
6958 {
6959 triggered_spell_id = 63321; // Life Tap
6960 break;
6961 }
6962 case 71519: // Deathbringer's Will Normal
6963 {
6964 if (!IsPlayer() || HasSpellCooldown(71484))
6965 return false;
6966
6967 AddSpellCooldown(71484, 0, cooldown);
6968
6969 std::vector<uint32> RandomSpells;
6970 switch (getClass())
6971 {
6972 case CLASS_WARRIOR:
6973 case CLASS_PALADIN:
6974 case CLASS_DEATH_KNIGHT:
6975 RandomSpells.push_back(71484);
6976 RandomSpells.push_back(71491);
6977 RandomSpells.push_back(71492);
6978 break;
6979 case CLASS_SHAMAN:
6980 case CLASS_ROGUE:
6981 RandomSpells.push_back(71486);
6982 RandomSpells.push_back(71485);
6983 RandomSpells.push_back(71492);
6984 break;
6985 case CLASS_DRUID:
6986 RandomSpells.push_back(71484);
6987 RandomSpells.push_back(71485);
6988 RandomSpells.push_back(71492);
6989 break;
6990 case CLASS_HUNTER:
6991 RandomSpells.push_back(71486);
6992 RandomSpells.push_back(71491);
6993 RandomSpells.push_back(71485);
6994 break;
6995 default:
6996 return false;
6997 }
6998 if (RandomSpells.empty()) // shouldn't happen
6999 return false;
7000
7001 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7002 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7003 break;
7004 }
7005 case 71562: // Deathbringer's Will Heroic
7006 {
7007 if (!IsPlayer() || HasSpellCooldown(71561))
7008 return false;
7009
7010 AddSpellCooldown(71561, 0, cooldown);
7011
7012 std::vector<uint32> RandomSpells;
7013 switch (getClass())
7014 {
7015 case CLASS_WARRIOR:
7016 case CLASS_PALADIN:
7017 case CLASS_DEATH_KNIGHT:
7018 RandomSpells.push_back(71561);
7019 RandomSpells.push_back(71559);
7020 RandomSpells.push_back(71560);
7021 break;
7022 case CLASS_SHAMAN:
7023 case CLASS_ROGUE:
7024 RandomSpells.push_back(71558);
7025 RandomSpells.push_back(71556);
7026 RandomSpells.push_back(71560);
7027 break;
7028 case CLASS_DRUID:
7029 RandomSpells.push_back(71561);
7030 RandomSpells.push_back(71556);
7031 RandomSpells.push_back(71560);
7032 break;
7033 case CLASS_HUNTER:
7034 RandomSpells.push_back(71558);
7035 RandomSpells.push_back(71559);
7036 RandomSpells.push_back(71556);
7037 break;
7038 default:
7039 return false;
7040 }
7041 if (RandomSpells.empty()) // shouldn't happen
7042 return false;
7043
7044 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7045 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7046 break;
7047 }
7048 // Freya, Petrified Bark
7049 case 62933:
7050 case 62337:
7051 {
7052 if (!victim)
7053 return false;
7054
7055 int32 dmg = damage;
7056 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
7057 return true;
7058 }
7059 // Trial of the Champion, Earth Shield
7060 case 67534:
7061 {
7062 const int32 dmg = (int32)damage;
7063 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
7064 return true;
7065 }
7066 // Trial of the Crusader, Faction Champions, Retaliation
7067 case 65932:
7068 {
7069 // check attack comes not from behind
7070 if (!victim || !HasInArc(M_PI, victim))
7071 return false;
7072
7073 triggered_spell_id = 65934;
7074 break;
7075 }
7076 // Pit of Saron, Tyrannus, Overlord's Brand
7077 case 69172: // everything except for DoTs
7078 {
7079 if (!target)
7080 return false;
7081 if (Unit* caster = triggeredByAura->GetCaster())
7082 {
7084 {
7085 int32 dmg = 5.5f * damage;
7086 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7087 }
7088 else
7089 {
7090 if (caster->GetVictim())
7091 {
7092 int32 dmg = damage;
7093 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7094 }
7095 }
7096 }
7097 return true;
7098 }
7099 // Pit of Saron, Tyrannus, Overlord's Brand
7100 case 69173: // only DoTs
7101 {
7102 if (!target)
7103 return false;
7104 if (Unit* caster = triggeredByAura->GetCaster())
7105 {
7106 if (procEx & PROC_EX_INTERNAL_HOT)
7107 {
7108 int32 dmg = 5.5f * damage;
7109 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7110 }
7111 else
7112 {
7113 if (caster->GetVictim())
7114 {
7115 int32 dmg = damage;
7116 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7117 }
7118 }
7119 }
7120 return true;
7121 }
7122 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7123 case 70674:
7124 {
7125 if (Unit* caster = triggeredByAura->GetCaster())
7126 {
7127 int32 dmg = 3 * damage;
7128 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7129 }
7130 return true;
7131 }
7132 // Item: Purified Shard of the Gods
7133 case 69755:
7134 {
7135 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7136 break;
7137 }
7138 // Item: Shiny Shard of the Gods
7139 case 69739:
7140 {
7141 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7142 break;
7143 }
7144 // VoA: Meteor Fists koralon
7145 case 66725:
7146 case 68161:
7147 {
7148 triggered_spell_id = 66765; // handled by spell_difficulty
7149 break;
7150 }
7151 }
7152 break;
7153 }
7154 case SPELLFAMILY_MAGE:
7155 {
7156 // Magic Absorption
7157 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7158 {
7160 return false;
7161
7162 // mana reward
7163 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7164 target = this;
7165 triggered_spell_id = 29442;
7166 break;
7167 }
7168 // Hot Streak
7169 if (dummySpell->SpellIconID == 2999)
7170 {
7171 if (effIndex != 0)
7172 return false;
7173 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7174 if (!counter)
7175 return true;
7176
7177 // Count spell criticals in a row in second aura
7178 if (procEx & PROC_EX_CRITICAL_HIT)
7179 {
7180 counter->SetAmount(counter->GetAmount() * 2);
7181 if (counter->GetAmount() < 100) // not enough
7182 return true;
7183 // Crititcal counted -> roll chance
7184 if (roll_chance_i(triggerAmount))
7185 CastSpell(this, 48108, true, castItem, triggeredByAura);
7186 }
7187 counter->SetAmount(25);
7188 return true;
7189 }
7190 // Incanter's Regalia set (add trigger chance to Mana Shield)
7191 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7192 {
7193 if (!IsPlayer())
7194 return false;
7195
7196 target = this;
7197 triggered_spell_id = 37436;
7198 break;
7199 }
7200 switch (dummySpell->Id)
7201 {
7202 // Glyph of Polymorph
7203 case 56375:
7204 {
7205 if (!target)
7206 return false;
7207 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7210 return true;
7211 }
7212 // Glyph of Icy Veins
7213 case 56374:
7214 {
7217 return true;
7218 }
7219 // Glyph of Ice Block
7220 case 56372:
7221 {
7222 Player* player = ToPlayer();
7223 if (!player)
7224 return false;
7225
7226 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7227 // remove cooldowns on all ranks of Frost Nova
7228 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7229 {
7230 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7231 // Frost Nova
7232 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7233 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7234 player->RemoveSpellCooldown(cdSpell->Id, true);
7235 }
7236 break;
7237 }
7238 }
7239 break;
7240 }
7242 {
7243 // Second Wind
7244 if (dummySpell->SpellIconID == 1697)
7245 {
7246 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7247 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7248 return false;
7249 // Need stun or root mechanic
7250 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7251 return false;
7252
7253 switch (dummySpell->Id)
7254 {
7255 case 29838:
7256 triggered_spell_id = 29842;
7257 break;
7258 case 29834:
7259 triggered_spell_id = 29841;
7260 break;
7261 case 42770:
7262 triggered_spell_id = 42771;
7263 break;
7264 default:
7265 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7266 return false;
7267 }
7268
7269 target = this;
7270 break;
7271 }
7272 break;
7273 }
7275 {
7276 switch (dummySpell->Id)
7277 {
7278 // Nightfall
7279 case 18094:
7280 case 18095:
7281 // Glyph of corruption
7282 case 56218:
7283 {
7284 target = this;
7285 triggered_spell_id = 17941;
7286 break;
7287 }
7288 // Soul Leech
7289 case 30293:
7290 case 30295:
7291 case 30296:
7292 {
7293 // Improved Soul Leech
7294 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7295 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7296 {
7297 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7298 {
7299 if ((*i)->GetEffIndex() != 0)
7300 continue;
7301 basepoints0 = int32((*i)->GetAmount());
7302 target = GetGuardianPet();
7303 if (target)
7304 {
7305 // regen mana for pet
7306 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7307 }
7308 // regen mana for caster
7309 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7310 // Get second aura of spell for replenishment effect on party
7311 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7312 {
7313 // Replenishment - roll chance
7314 if (roll_chance_i(aurEff->GetAmount()))
7315 {
7316 CastSpell(this, 57669, true, castItem, triggeredByAura);
7317 }
7318 }
7319 break;
7320 }
7321 }
7322 // health
7323 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7324 target = this;
7325 triggered_spell_id = 30294;
7326 break;
7327 }
7328 // Shadowflame (Voidheart Raiment set bonus)
7329 case 37377:
7330 {
7331 triggered_spell_id = 37379;
7332 break;
7333 }
7334 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7335 case 37381:
7336 {
7337 target = GetGuardianPet();
7338 if (!target)
7339 return false;
7340
7341 // heal amount
7342 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7343 triggered_spell_id = 37382;
7344 break;
7345 }
7346 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7347 case 39437:
7348 {
7349 triggered_spell_id = 37378;
7350 break;
7351 }
7352 }
7353 break;
7354 }
7355 case SPELLFAMILY_PRIEST:
7356 {
7357 // Body and Soul
7358 if (dummySpell->SpellIconID == 2218)
7359 {
7360 // Proc only from Abolish desease on self cast
7361 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7362 return false;
7363 triggered_spell_id = 64136;
7364 target = this;
7365 break;
7366 }
7367 switch (dummySpell->Id)
7368 {
7369 // Vampiric Embrace
7370 case 15286:
7371 {
7372 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7373 return false;
7374
7375 // heal amount
7376 int32 total = CalculatePct(int32(damage), triggerAmount);
7377 int32 team = total / 5;
7378 int32 self = total - team;
7379 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7380 return true; // no hidden cooldown
7381 }
7382 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7383 case 40438:
7384 {
7385 // Shadow Word: Pain
7386 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7387 triggered_spell_id = 40441;
7388 // Renew
7389 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7390 triggered_spell_id = 40440;
7391 else
7392 return false;
7393
7394 target = this;
7395 break;
7396 }
7397 // Improved Shadowform
7398 case 47570:
7399 case 47569:
7400 {
7401 if (!roll_chance_i(triggerAmount))
7402 return false;
7403
7405 break;
7406 }
7407 // Glyph of Dispel Magic
7408 case 55677:
7409 {
7410 // Dispel Magic shares spellfamilyflag with abolish disease
7411 if (procSpell->SpellIconID != 74)
7412 return false;
7413 if (!target || !target->IsFriendlyTo(this))
7414 return false;
7415
7416 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7417 triggered_spell_id = 56131;
7418 break;
7419 }
7420 // Oracle Healing Bonus ("Garments of the Oracle" set)
7421 case 26169:
7422 {
7423 // heal amount
7424 basepoints0 = int32(CalculatePct(damage, 10));
7425 target = this;
7426 triggered_spell_id = 26170;
7427 break;
7428 }
7429 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7430 case 39372:
7431 {
7432 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7433 return false;
7434
7435 // heal amount
7436 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7437 target = this;
7438 triggered_spell_id = 39373;
7439 break;
7440 }
7441 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7442 case 28809:
7443 {
7444 triggered_spell_id = 28810;
7445 break;
7446 }
7447 // Priest T10 Healer 2P Bonus
7448 case 70770:
7449 // Flash Heal
7450 if (procSpell->SpellFamilyFlags[0] & 0x800)
7451 {
7452 triggered_spell_id = 70772;
7453 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7454 if (!blessHealing || !victim)
7455 return false;
7456 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7457 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7458 return true;
7459 }
7460 break;
7461 }
7462 break;
7463 }
7464 case SPELLFAMILY_DRUID:
7465 {
7466 switch (dummySpell->Id)
7467 {
7468 // Glyph of Innervate
7469 case 54832:
7470 {
7471 if (procSpell->SpellIconID != 62)
7472 return false;
7473
7474 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7475 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7476 triggered_spell_id = 54833;
7477 target = this;
7478 break;
7479 }
7480 // Glyph of Starfire
7481 case 54845:
7482 {
7483 triggered_spell_id = 54846;
7484 break;
7485 }
7486 // Glyph of Shred
7487 case 54815:
7488 {
7489 if (!target)
7490 return false;
7491
7492 // try to find spell Rip on the target
7493 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7494 {
7495 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7496 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7497
7498 // just Rip's max duration without other spells
7499 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7500
7501 // add possible auras' and Glyph of Shred's max duration
7502 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7503 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7504 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7505
7506 // if min < max -> that means caster didn't cast 3 shred yet
7507 // so set Rip's duration and max duration
7508 if (CountMin < CountMax)
7509 {
7510 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7511 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7512 return true;
7513 }
7514 }
7515 // if not found Rip
7516 return false;
7517 }
7518 // Glyph of Rake
7519 case 54821:
7520 {
7521 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7522 {
7523 if (target && target->IsCreature())
7524 {
7525 triggered_spell_id = 54820;
7526 break;
7527 }
7528 }
7529 return false;
7530 }
7531 // Leader of the Pack
7532 case 24932:
7533 {
7534 if (triggerAmount <= 0)
7535 return false;
7536 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7537 target = this;
7538 triggered_spell_id = 34299;
7539 if (triggeredByAura->GetCasterGUID() != GetGUID())
7540 break;
7541 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7542 // Improved Leader of the Pack
7543 // Check cooldown of heal spell cooldown
7544 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7545 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7546 break;
7547 }
7548 // Healing Touch (Dreamwalker Raiment set)
7549 case 28719:
7550 {
7551 // mana back
7552 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7553 target = this;
7554 triggered_spell_id = 28742;
7555 break;
7556 }
7557 // Glyph of Rejuvenation
7558 case 54754:
7559 {
7560 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7561 return false;
7562 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7563 triggered_spell_id = 54755;
7564 break;
7565 }
7566 // Healing Touch Refund (Idol of Longevity trinket)
7567 case 28847:
7568 {
7569 target = this;
7570 triggered_spell_id = 28848;
7571 break;
7572 }
7573 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7574 case 37288:
7575 case 37295:
7576 {
7577 target = this;
7578 triggered_spell_id = 37238;
7579 break;
7580 }
7581 // Druid Tier 6 Trinket
7582 case 40442:
7583 {
7584 float chance;
7585
7586 // Starfire
7587 if (procSpell->SpellFamilyFlags[0] & 0x4)
7588 {
7589 triggered_spell_id = 40445;
7590 chance = 25.0f;
7591 }
7592 // Rejuvenation
7593 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7594 {
7595 triggered_spell_id = 40446;
7596 chance = 25.0f;
7597 }
7598 // Mangle (Bear) and Mangle (Cat)
7599 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7600 {
7601 triggered_spell_id = 40452;
7602 chance = 40.0f;
7603 }
7604 else
7605 return false;
7606
7607 if (!roll_chance_f(chance))
7608 return false;
7609
7610 target = this;
7611 break;
7612 }
7613 // Maim Interrupt
7614 case 44835:
7615 {
7616 // Deadly Interrupt Effect
7617 triggered_spell_id = 32747;
7618 break;
7619 }
7620 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7621 case 70664:
7622 {
7623 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7624 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7625 return false;
7626
7627 Player* caster = ToPlayer();
7628 if (!caster)
7629 return false;
7630 if (!caster->GetGroup() && victim == this)
7631 return false;
7632
7633 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7634 return true;
7635 }
7636 }
7637 // Eclipse
7638 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7639 {
7640 if (!procSpell || effIndex != 0)
7641 return false;
7642
7643 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7644
7645 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7646 return false;
7647
7648 target = this;
7649 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7650 return false;
7651
7652 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7653 break;
7654 }
7655 [[fallthrough]];
7656 }
7657 case SPELLFAMILY_ROGUE:
7658 {
7659 switch (dummySpell->Id)
7660 {
7661 // Glyph of Backstab
7662 case 56800:
7663 {
7664 if (victim)
7665 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7666 if (Aura* aur = aurEff->GetBase())
7667 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7668 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7669 {
7670 aur->SetDuration(aur->GetDuration() + 2000);
7671 return true;
7672 }
7673 return false;
7674 }
7675 // Deadly Throw Interrupt
7676 case 32748:
7677 {
7678 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7679 if (this == victim)
7680 return false;
7681
7682 triggered_spell_id = 32747;
7683 break;
7684 }
7685 }
7686 // Master of subtlety
7687 if (dummySpell->SpellIconID == 2114)
7688 {
7689 triggered_spell_id = 31665;
7690 basepoints0 = triggerAmount;
7691 break;
7692 }
7693 // Cut to the Chase
7694 if (dummySpell->SpellIconID == 2909)
7695 {
7696 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7697 // lookup Slice and Dice
7698 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7699 {
7700 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7701 return true;
7702 }
7703 return false;
7704 }
7705 // Deadly Brew
7706 else if (dummySpell->SpellIconID == 2963)
7707 {
7708 triggered_spell_id = 3409;
7709 break;
7710 }
7711 // Quick Recovery
7712 else if (dummySpell->SpellIconID == 2116)
7713 {
7714 if (!procSpell)
7715 return false;
7716
7717 // energy cost save
7718 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7719 if (basepoints0 <= 0)
7720 return false;
7721
7722 target = this;
7723 triggered_spell_id = 31663;
7724 break;
7725 }
7726 break;
7727 }
7728 case SPELLFAMILY_HUNTER:
7729 {
7730 switch (dummySpell->SpellIconID)
7731 {
7732 case 2236: // Thrill of the Hunt
7733 {
7734 if (!procSpell)
7735 return false;
7736
7738
7739 // Disable charge drop because of Lock and Load
7740 if (spell)
7741 ToPlayer()->SetSpellModTakingSpell(spell, false);
7742
7743 // Explosive Shot
7744 if (procSpell->SpellFamilyFlags[2] & 0x200)
7745 {
7746 if (!victim)
7747 return false;
7748 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7749 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7750 }
7751 else
7752 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7753
7754 if (spell)
7755 ToPlayer()->SetSpellModTakingSpell(spell, true);
7756
7757 if (basepoints0 <= 0)
7758 return false;
7759
7760 target = this;
7761 triggered_spell_id = 34720;
7762 break;
7763 }
7764 case 3406: // Hunting Party
7765 {
7766 triggered_spell_id = 57669;
7767 target = this;
7768 break;
7769 }
7770 case 3560: // Rapid Recuperation
7771 {
7772 // This effect only from Rapid Killing (mana regen)
7773 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7774 return false;
7775
7776 target = this;
7777
7778 switch (dummySpell->Id)
7779 {
7780 case 53228: // Rank 1
7781 triggered_spell_id = 56654;
7782 break;
7783 case 53232: // Rank 2
7784 triggered_spell_id = 58882;
7785 break;
7786 }
7787 break;
7788 }
7789 }
7790
7791 switch (dummySpell->Id)
7792 {
7793 case 57870: // Glyph of Mend Pet
7794 {
7795 if (!victim)
7796 return false;
7797
7798 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7799 return true;
7800 }
7801 }
7802 break;
7803 }
7805 {
7806 // Light's Beacon - Beacon of Light
7807 if (dummySpell->Id == 53651)
7808 {
7809 if (!victim)
7810 return false;
7811
7812 // Do not proc from Glyph of Holy Light and Judgement of Light
7813 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7814 {
7815 return false;
7816 }
7817
7818 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7819 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7820 return false;
7821
7822 basepoints0 = int32(damage);
7823 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7824
7825 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7826 return true;
7827 }
7828 // Judgements of the Wise
7829 if (dummySpell->SpellIconID == 3017)
7830 {
7831 target = this;
7832 triggered_spell_id = 31930;
7833 // replenishment
7834 CastSpell(this, 57669, true, castItem, triggeredByAura);
7835 break;
7836 }
7837 // Righteous Vengeance
7838 if (dummySpell->SpellIconID == 3025)
7839 {
7840 if (!victim)
7841 return false;
7842
7843 // 4 damage tick
7844 basepoints0 = triggerAmount * damage / 400;
7845 triggered_spell_id = 61840;
7846 // Add remaining ticks to damage done
7847 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7848 return true;
7849 }
7850 // Sheath of Light
7851 if (dummySpell->SpellIconID == 3030)
7852 {
7853 // 4 healing tick
7854 basepoints0 = triggerAmount * damage / 400;
7855 triggered_spell_id = 54203;
7856 break;
7857 }
7858 switch (dummySpell->Id)
7859 {
7860 // Judgement of Light
7861 case 20185:
7862 {
7863 if (!victim || !victim->IsAlive())
7864 return false;
7865
7866 auto* caster = triggeredByAura->GetBase()->GetCaster();
7867 if (!caster || !victim->IsFriendlyTo(caster))
7868 return false;
7869
7870 // 2% of base health
7871 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7872 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7873 return true;
7874 }
7875 // Judgement of Wisdom
7876 case 20186:
7877 {
7878 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA))
7879 return false;
7880
7881 auto* caster = triggeredByAura->GetBase()->GetCaster();
7882 if (!caster || !victim->IsFriendlyTo(caster))
7883 return false;
7884
7885 // 2% of base mana
7886 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7887 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7888 return true;
7889 }
7890 // Holy Power (Redemption Armor set)
7891 case 28789:
7892 {
7893 if (!victim)
7894 return false;
7895
7896 // Set class defined buff
7897 switch (victim->getClass())
7898 {
7899 case CLASS_PALADIN:
7900 case CLASS_PRIEST:
7901 case CLASS_SHAMAN:
7902 case CLASS_DRUID:
7903 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7904 break;
7905 case CLASS_MAGE:
7906 case CLASS_WARLOCK:
7907 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7908 break;
7909 case CLASS_HUNTER:
7910 case CLASS_ROGUE:
7911 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7912 break;
7913 case CLASS_WARRIOR:
7914 triggered_spell_id = 28790; // Increases the friendly target's armor
7915 break;
7916 default:
7917 return false;
7918 }
7919 break;
7920 }
7921 // Seal of Vengeance (damage calc on apply aura)
7922 case 31801:
7923 {
7924 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7925 return false;
7926
7927 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7928 bool stacker = !procSpell || procSpell->Id == 53595;
7929 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7930 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7931
7932 if (!stacker && !damager)
7933 return false;
7934
7935 triggered_spell_id = 31803;
7936
7937 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7938 {
7939 if (aur->GetStackAmount() == 5)
7940 {
7941 if (stacker)
7942 aur->RefreshDuration();
7943 }
7944 }
7945
7946 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
7947
7948 if (!stacker)
7949 return false;
7950 break;
7951 }
7952 // Seal of Corruption
7953 case 53736:
7954 {
7955 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7956 return false;
7957
7958 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7959 bool stacker = !procSpell || procSpell->Id == 53595;
7960 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7961 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7962
7963 if (!stacker && !damager)
7964 return false;
7965
7966 triggered_spell_id = 53742;
7967
7968 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7969 {
7970 if (aur->GetStackAmount() == 5)
7971 {
7972 if (stacker)
7973 aur->RefreshDuration();
7974 }
7975 }
7976
7977 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
7978
7979 if (!stacker)
7980 return false;
7981 break;
7982 }
7983 // Spiritual Attunement
7984 case 31785:
7985 case 33776:
7986 {
7987 // if healed by another unit (victim)
7988 if (this == victim)
7989 return false;
7990
7991 // dont allow non-positive dots to proc
7992 if (!procSpell || !procSpell->IsPositive())
7993 return false;
7994
7995 HealInfo const* healInfo = eventInfo.GetHealInfo();
7996 if (!healInfo)
7997 {
7998 return false;
7999 }
8000
8001 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
8002 if (effectiveHeal)
8003 {
8004 // heal amount
8005 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
8006 target = this;
8007
8008 if (basepoints0)
8009 triggered_spell_id = 31786;
8010 }
8011 break;
8012 }
8013 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
8014 case 40470:
8015 {
8016 if (!procSpell)
8017 return false;
8018
8019 float chance = 0.0f;
8020
8021 // Flash of light/Holy light
8022 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
8023 {
8024 triggered_spell_id = 40471;
8025 chance = 15.0f;
8026 }
8027 // Judgement (any)
8028 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
8029 {
8030 triggered_spell_id = 40472;
8031 chance = 50.0f;
8032 }
8033 else
8034 return false;
8035
8036 if (!roll_chance_f(chance))
8037 return false;
8038
8039 break;
8040 }
8041 // Glyph of Holy Light
8042 case 54937:
8043 {
8044 triggered_spell_id = 54968;
8045 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8046 break;
8047 }
8048 // Item - Paladin T8 Holy 2P Bonus
8049 case 64890:
8050 {
8051 triggered_spell_id = 64891;
8052 basepoints0 = triggerAmount * damage / 300;
8053 break;
8054 }
8055 case 71406: // Tiny Abomination in a Jar
8056 case 71545: // Tiny Abomination in a Jar (Heroic)
8057 {
8058 if (!victim || !victim->IsAlive())
8059 return false;
8060
8061 CastSpell(this, 71432, true, nullptr, triggeredByAura);
8062
8063 Aura const* dummy = GetAura(71432);
8064 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
8065 return false;
8066
8067 RemoveAurasDueToSpell(71432);
8068 triggered_spell_id = 71433; // default main hand attack
8069 // roll if offhand
8070 if (Player const* player = ToPlayer())
8071 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
8072 triggered_spell_id = 71434;
8073 target = victim;
8074 break;
8075 }
8076 // Item - Icecrown 25 Normal Dagger Proc
8077 case 71880:
8078 {
8079 switch (getPowerType())
8080 {
8081 case POWER_MANA:
8082 triggered_spell_id = 71881;
8083 break;
8084 case POWER_RAGE:
8085 triggered_spell_id = 71883;
8086 break;
8087 case POWER_ENERGY:
8088 triggered_spell_id = 71882;
8089 break;
8090 case POWER_RUNIC_POWER:
8091 triggered_spell_id = 71884;
8092 break;
8093 default:
8094 return false;
8095 }
8096 break;
8097 }
8098 // Item - Icecrown 25 Heroic Dagger Proc
8099 case 71892:
8100 {
8101 switch (getPowerType())
8102 {
8103 case POWER_MANA:
8104 triggered_spell_id = 71888;
8105 break;
8106 case POWER_RAGE:
8107 triggered_spell_id = 71886;
8108 break;
8109 case POWER_ENERGY:
8110 triggered_spell_id = 71887;
8111 break;
8112 case POWER_RUNIC_POWER:
8113 triggered_spell_id = 71885;
8114 break;
8115 default:
8116 return false;
8117 }
8118 break;
8119 }
8120 }
8121 break;
8122 }
8123 case SPELLFAMILY_SHAMAN:
8124 {
8125 switch (dummySpell->Id)
8126 {
8127 // Tidal Force
8128 case 55198:
8129 {
8130 // Remove aura stack from caster
8131 RemoveAuraFromStack(55166);
8132 // drop charges
8133 return false;
8134 }
8135 // Totemic Power (The Earthshatterer set)
8136 case 28823:
8137 {
8138 if (!victim)
8139 return false;
8140
8141 // Set class defined buff
8142 switch (victim->getClass())
8143 {
8144 case CLASS_PALADIN:
8145 case CLASS_PRIEST:
8146 case CLASS_SHAMAN:
8147 case CLASS_DRUID:
8148 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8149 break;
8150 case CLASS_MAGE:
8151 case CLASS_WARLOCK:
8152 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8153 break;
8154 case CLASS_HUNTER:
8155 case CLASS_ROGUE:
8156 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8157 break;
8158 case CLASS_WARRIOR:
8159 triggered_spell_id = 28827; // Increases the friendly target's armor
8160 break;
8161 default:
8162 return false;
8163 }
8164 break;
8165 }
8166 // Lesser Healing Wave (Totem of Flowing Water Relic)
8167 case 28849:
8168 {
8169 target = this;
8170 triggered_spell_id = 28850;
8171 break;
8172 }
8173 // Windfury Weapon (Passive) 1-8 Ranks
8174 case 33757:
8175 {
8176 Player* player = ToPlayer();
8177 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8178 return false;
8179
8180 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8181 return false;
8182
8183 WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
8184 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8185 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8186 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8187 return false;
8188
8189 // Now amount of extra power stored in 1 effect of Enchant spell
8190 // Get it by item enchant id
8191 uint32 spellId;
8193 {
8194 case 283:
8195 spellId = 8232;
8196 break; // 1 Rank
8197 case 284:
8198 spellId = 8235;
8199 break; // 2 Rank
8200 case 525:
8201 spellId = 10486;
8202 break; // 3 Rank
8203 case 1669:
8204 spellId = 16362;
8205 break; // 4 Rank
8206 case 2636:
8207 spellId = 25505;
8208 break; // 5 Rank
8209 case 3785:
8210 spellId = 58801;
8211 break; // 6 Rank
8212 case 3786:
8213 spellId = 58803;
8214 break; // 7 Rank
8215 case 3787:
8216 spellId = 58804;
8217 break; // 8 Rank
8218 default:
8219 {
8220 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8221 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8222 return false;
8223 }
8224 }
8225
8226 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8227 if (!windfurySpellInfo)
8228 {
8229 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8230 return false;
8231 }
8232
8233 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8234
8235 // Value gained from additional AP
8236 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8237
8238 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8239 triggered_spell_id = 25504;
8240
8241 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8242 triggered_spell_id = 33750;
8243
8244 // custom cooldown processing case
8245 if (player->HasSpellCooldown(dummySpell->Id))
8246 return false;
8247
8248 // apply cooldown before cast to prevent processing itself
8249 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8250
8251 // Attack Twice
8252 for (uint32 i = 0; i < 2; ++i)
8253 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8254
8255 return true;
8256 }
8257 // Shaman Tier 6 Trinket
8258 case 40463:
8259 {
8260 if (!procSpell)
8261 return false;
8262
8263 float chance;
8264 if (procSpell->SpellFamilyFlags[0] & 0x1)
8265 {
8266 triggered_spell_id = 40465; // Lightning Bolt
8267 chance = 15.0f;
8268 }
8269 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8270 {
8271 triggered_spell_id = 40465; // Lesser Healing Wave
8272 chance = 10.0f;
8273 }
8274 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8275 {
8276 triggered_spell_id = 40466; // Stormstrike
8277 chance = 50.0f;
8278 }
8279 else
8280 return false;
8281
8282 if (!roll_chance_f(chance))
8283 return false;
8284
8285 target = this;
8286 break;
8287 }
8288 // Glyph of Healing Wave
8289 case 55440:
8290 {
8291 // Not proc from self heals
8292 if (this == victim)
8293 return false;
8294 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8295 target = this;
8296 triggered_spell_id = 55533;
8297 break;
8298 }
8299 // Spirit Hunt
8300 case 58877:
8301 {
8302 // Cast on owner
8303 target = GetOwner();
8304 if (!target)
8305 return false;
8306 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8307 triggered_spell_id = 58879;
8308 // Heal wolf
8309 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8310 break;
8311 }
8312 // Shaman T9 Elemental 4P Bonus
8313 case 67228:
8314 {
8315 // Lava Burst
8316 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8317 {
8318 triggered_spell_id = 71824;
8319 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8320 if (!triggeredSpell)
8321 return false;
8322 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8323 }
8324 break;
8325 }
8326 // Item - Shaman T10 Elemental 4P Bonus
8327 case 70817:
8328 {
8329 if (!target)
8330 return false;
8331 // try to find spell Flame Shock on the target
8332 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8333 {
8334 Aura* flameShock = aurEff->GetBase();
8335 int32 extraTime = 2 * aurEff->GetAmplitude();
8336 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8337 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8338
8339 return true;
8340 }
8341 // if not found Flame Shock
8342 return false;
8343 }
8344 break;
8345 }
8346 // Frozen Power
8347 if (dummySpell->SpellIconID == 3780)
8348 {
8349 if (!target)
8350 return false;
8351 if (GetDistance(target) < 15.0f)
8352 return false;
8353 float chance = (float)triggerAmount;
8354 if (!roll_chance_f(chance))
8355 return false;
8356
8357 triggered_spell_id = 63685;
8358 break;
8359 }
8360 // Ancestral Awakening
8361 if (dummySpell->SpellIconID == 3065)
8362 {
8363 triggered_spell_id = 52759;
8364 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8365 target = this;
8366 break;
8367 }
8368 // Flametongue Weapon (Passive)
8369 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8370 {
8371 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8372 return false;
8373
8375 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8376 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8377 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8378 return false;
8379
8380 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8381
8382 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8384
8385 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8386 ApplyPct(add_spellpower, 3.84f);
8387
8388 // Enchant on Off-Hand and ready?
8389 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8390 {
8391 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8392
8393 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8394 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8395 triggered_spell_id = 10444;
8396 }
8397
8398 // Enchant on Main-Hand and ready?
8399 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8400 {
8401 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8402
8403 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8404 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8405 triggered_spell_id = 10444;
8406 }
8407
8408 // If not ready, we should return, shouldn't we?!
8409 else
8410 return false;
8411
8412 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8413 return true;
8414 }
8415 // Improved Water Shield
8416 if (dummySpell->SpellIconID == 2287)
8417 {
8418 if (!procSpell)
8419 return false;
8420
8421 // Default chance for Healing Wave and Riptide
8422 float chance = (float)triggeredByAura->GetAmount();
8423
8424 if (procSpell->SpellFamilyFlags[0] & 0x80)
8425 // Lesser Healing Wave - 0.6 of default
8426 chance *= 0.6f;
8427 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8428 // Chain heal - 0.3 of default
8429 chance *= 0.3f;
8430
8431 if (!roll_chance_f(chance))
8432 return false;
8433
8434 // Water Shield
8435 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8436 {
8437 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8438 CastSpell(this, spell, true, castItem, triggeredByAura);
8439 return true;
8440 }
8441 return false;
8442 }
8443 // Lightning Overload
8444 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8445 {
8446 if (!procSpell || !IsPlayer() || !victim)
8447 return false;
8448
8449 uint32 spell = 45284;
8450
8451 // chain lightning only procs 1/3 of the time
8452 if (procSpell->SpellFamilyFlags[0] & 0x2)
8453 {
8454 if (!roll_chance_i(33))
8455 return false;
8456 spell = 45297;
8457 }
8458
8459 if (procEx & PROC_EX_CRITICAL_HIT)
8460 damage /= 2;
8461
8462 // do not reduce damage-spells have correct basepoints
8463 damage /= 2;
8464 int32 dmg = damage;
8465
8466 // Cast
8467 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8468 return true;
8469 }
8470 // Static Shock
8471 if (dummySpell->SpellIconID == 3059)
8472 {
8473 // Lightning Shield
8475 {
8476 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8477 CastSpell(target, spell, true, castItem, triggeredByAura);
8478 aurEff->GetBase()->DropCharge();
8479 return true;
8480 }
8481 return false;
8482 }
8483 break;
8484 }
8486 {
8487 // Improved Blood Presence
8488 if (dummySpell->SpellIconID == 2636)
8489 {
8490 if (!IsPlayer())
8491 return false;
8492 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8493 break;
8494 }
8495 // Butchery
8496 if (dummySpell->SpellIconID == 2664)
8497 {
8498 basepoints0 = triggerAmount;
8499 triggered_spell_id = 50163;
8500 target = this;
8501 break;
8502 }
8503 // Mark of Blood
8504 if (dummySpell->Id == 49005)
8505 {
8507 triggered_spell_id = 61607;
8508 break;
8509 }
8510 // Unholy Blight
8511 if (dummySpell->Id == 49194)
8512 {
8513 triggered_spell_id = 50536;
8514 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8515 if (!unholyBlight || !victim)
8516 return false;
8517
8518 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8519
8520 //Glyph of Unholy Blight
8521 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8522 AddPct(basepoints0, glyph->GetAmount());
8523
8524 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8525 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8526 return true;
8527 }
8528 // Vendetta
8529 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8530 {
8531 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8532 triggered_spell_id = 50181;
8533 target = this;
8534 break;
8535 }
8536 // Necrosis
8537 if (dummySpell->SpellIconID == 2709)
8538 {
8539 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8540 triggered_spell_id = 51460;
8541 break;
8542 }
8543 // Threat of Thassarian
8544 if (dummySpell->SpellIconID == 2023)
8545 {
8546 // Must Dual Wield
8547 if (!procSpell || !HasOffhandWeaponForAttack())
8548 return false;
8549 // Chance as basepoints for dummy aura
8550 if (!roll_chance_i(triggerAmount))
8551 return false;
8552
8553 switch (procSpell->Id)
8554 {
8555 // Obliterate
8556 case 49020:
8557 triggered_spell_id = 66198;
8558 break; // Rank 1
8559 case 51423:
8560 triggered_spell_id = 66972;
8561 break; // Rank 2
8562 case 51424:
8563 triggered_spell_id = 66973;
8564 break; // Rank 3
8565 case 51425:
8566 triggered_spell_id = 66974;
8567 break; // Rank 4
8568
8569 // Frost Strike
8570 case 49143:
8571 triggered_spell_id = 66196;
8572 break; // Rank 1
8573 case 51416:
8574 triggered_spell_id = 66958;
8575 break; // Rank 2
8576 case 51417:
8577 triggered_spell_id = 66959;
8578 break; // Rank 3
8579 case 51418:
8580 triggered_spell_id = 66960;
8581 break; // Rank 4
8582 case 51419:
8583 triggered_spell_id = 66961;
8584 break; // Rank 5
8585 case 55268:
8586 triggered_spell_id = 66962;
8587 break; // Rank 6
8588
8589 // Plague Strike
8590 case 45462:
8591 triggered_spell_id = 66216;
8592 break; // Rank 1
8593 case 49917:
8594 triggered_spell_id = 66988;
8595 break; // Rank 2
8596 case 49918:
8597 triggered_spell_id = 66989;
8598 break; // Rank 3
8599 case 49919:
8600 triggered_spell_id = 66990;
8601 break; // Rank 4
8602 case 49920:
8603 triggered_spell_id = 66991;
8604 break; // Rank 5
8605 case 49921:
8606 triggered_spell_id = 66992;
8607 break; // Rank 6
8608
8609 // Death Strike
8610 case 49998:
8611 triggered_spell_id = 66188;
8612 break; // Rank 1
8613 case 49999:
8614 triggered_spell_id = 66950;
8615 break; // Rank 2
8616 case 45463:
8617 triggered_spell_id = 66951;
8618 break; // Rank 3
8619 case 49923:
8620 triggered_spell_id = 66952;
8621 break; // Rank 4
8622 case 49924:
8623 triggered_spell_id = 66953;
8624 break; // Rank 5
8625
8626 // Rune Strike
8627 case 56815:
8628 triggered_spell_id = 66217;
8629 break; // Rank 1
8630
8631 // Blood Strike
8632 case 45902:
8633 triggered_spell_id = 66215;
8634 break; // Rank 1
8635 case 49926:
8636 triggered_spell_id = 66975;
8637 break; // Rank 2
8638 case 49927:
8639 triggered_spell_id = 66976;
8640 break; // Rank 3
8641 case 49928:
8642 triggered_spell_id = 66977;
8643 break; // Rank 4
8644 case 49929:
8645 triggered_spell_id = 66978;
8646 break; // Rank 5
8647 case 49930:
8648 triggered_spell_id = 66979;
8649 break; // Rank 6
8650 default:
8651 return false;
8652 }
8653
8654 // This should do, restore spell mod so next attack can also use this!
8655 // crit chance for first strike is already computed
8656 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8657 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8658
8659 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8660 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8661 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8662 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8663
8664 SetCantProc(true);
8665 if (basepoints0)
8666 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8667 else
8668 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8669 SetCantProc(false);
8670 return true;
8671 }
8672 // Runic Power Back on Snare/Root
8673 if (dummySpell->Id == 61257)
8674 {
8675 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8676 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8677 return false;
8678 // Need snare or root mechanic
8679 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8680 return false;
8681 triggered_spell_id = 61258;
8682 target = this;
8683 break;
8684 }
8685 // Sudden Doom
8686 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8687 {
8688 SpellChainNode const* chain = nullptr;
8689 // get highest rank of the Death Coil spell
8690 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8691 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8692 {
8693 // check if shown in spell book
8694 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8695 continue;
8696
8697 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8698 if (!spellProto)
8699 continue;
8700
8701 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8702 && spellProto->SpellFamilyFlags[0] & 0x2000)
8703 {
8704 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8705
8706 // No chain entry or entry lower than found entry
8707 if (!chain || !newChain || (chain->rank < newChain->rank))
8708 {
8709 triggered_spell_id = itr->first;
8710 chain = newChain;
8711 }
8712 else
8713 continue;
8714 // Found spell is last in chain - do not need to look more
8715 // Optimisation for most common case
8716 if (chain && chain->last->Id == itr->first)
8717 break;
8718 }
8719 }
8720 }
8721 break;
8722 }
8723 case SPELLFAMILY_POTION:
8724 {
8725 // alchemist's stone
8726 if (dummySpell->Id == 17619)
8727 {
8728 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8729 {
8730 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8731 {
8732 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8733 {
8734 triggered_spell_id = 21399;
8735 }
8736 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8737 {
8738 triggered_spell_id = 21400;
8739 }
8740 else
8741 continue;
8742
8743 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8744 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8745 }
8746 return true;
8747 }
8748 }
8749 break;
8750 }
8751 case SPELLFAMILY_PET:
8752 {
8753 switch (dummySpell->SpellIconID)
8754 {
8755 // Guard Dog
8756 case 201:
8757 {
8758 if (!victim)
8759 return false;
8760
8761 triggered_spell_id = 54445;
8762 target = this;
8763 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8764 victim->AddThreat(this, addThreat);
8765 break;
8766 }
8767 // Silverback
8768 case 1582:
8769 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8770 target = this;
8771 break;
8772 }
8773 break;
8774 }
8775 default:
8776 break;
8777 }
8778
8779 // if not handled by custom case, get triggered spell from dummySpell proto
8780 if (!triggered_spell_id)
8781 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8782
8783 // processed charge only counting case
8784 if (!triggered_spell_id)
8785 return true;
8786
8787 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8788 if (!triggerEntry)
8789 {
8790 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8791 return false;
8792 }
8793
8794 if (cooldown_spell_id == 0)
8795 cooldown_spell_id = triggered_spell_id;
8796
8797 if (cooldown)
8798 {
8799 if (HasSpellCooldown(cooldown_spell_id))
8800 return false;
8801
8802 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8803 }
8804
8805 if (basepoints0)
8806 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8807 else
8808 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8809
8810 return true;
8811}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition CreatureAIImpl.h:25
EnchantmentSlot
Definition Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition Item.h:170
std::map< uint32, SpellCooldown > SpellCooldowns
Definition Player.h:209
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition Player.h:194
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:686
@ PLAYERSPELL_REMOVED
Definition Player.h:122
int32 irand(int32 min, int32 max)
Definition Random.cpp:37
@ SPELL_EFFECT_ENERGIZE
Definition SharedDefines.h:819
@ LANG_UNIVERSAL
Definition SharedDefines.h:746
@ CLASS_DRUID
Definition SharedDefines.h:151
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ CLASS_PRIEST
Definition SharedDefines.h:145
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ MECHANIC_STUN
Definition SharedDefines.h:1348
@ MECHANIC_ROOT
Definition SharedDefines.h:1343
@ MECHANIC_SNARE
Definition SharedDefines.h:1347
@ SPELLFAMILY_WARLOCK
Definition SharedDefines.h:3799
@ SPELLFAMILY_PALADIN
Definition SharedDefines.h:3804
@ SPELLFAMILY_HUNTER
Definition SharedDefines.h:3803
@ SPELLFAMILY_POTION
Definition SharedDefines.h:3807
@ SPELLFAMILY_ROGUE
Definition SharedDefines.h:3802
@ SPELLFAMILY_DRUID
Definition SharedDefines.h:3801
@ SPELLFAMILY_PET
Definition SharedDefines.h:3811
@ REP_EXALTED
Definition SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition SharedDefines.h:313
@ SPELL_SCHOOL_MASK_FIRE
Definition SharedDefines.h:310
@ SPELL_SCHOOL_MASK_FROST
Definition SharedDefines.h:312
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition SpellMgr.h:122
WeaponAttackType
Definition Unit.h:209
T ApplyPct(T &base, U pct)
Definition Util.h:73
Definition Unit.h:374
uint32 GetEffectiveHeal() const
Definition Unit.h:414
uint8 GetSlot() const
Definition Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition Item.h:304
bool IsEquipped() const
Definition Item.cpp:789
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition Player.cpp:10124
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:9972
bool HasSpellCooldown(uint32 spell_id) const override
Definition Player.cpp:16370
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1775
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition Player.cpp:11124
SpellCooldowns GetSpellCooldowns() const
Definition Player.h:2175
static uint8 GetAttackBySlot(uint8 slot)
Definition PlayerStorage.cpp:542
ReputationRank GetReputationRank(uint32 faction_id) const
Definition Player.cpp:5898
Unit * GetSelectedUnit() const
Definition Player.cpp:11566
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:3548
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:9425
Item * GetItemByGuid(ObjectGuid guid) const
Definition PlayerStorage.cpp:407
Spell * m_spellModTakingSpell
Definition Player.h:2562
uint32 ProcChance
Definition SpellInfo.h:356
SpellInfo const * GetSpellInfo() const
Definition Spell.h:586
int32 GetPowerCost() const
Definition Spell.h:587
uint32 GetCreatePowers(Powers power) const
Definition Unit.cpp:15751
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5650
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition Unit.cpp:5322
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition Unit.cpp:14956
void SetCantProc(bool apply)
Definition Unit.cpp:17373
bool HealthBelowPct(int32 pct) const
Definition Unit.h:1039
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4978
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition Unit.cpp:12072
bool IsFriendlyTo(Unit const *unit) const
Definition Unit.cpp:10315
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12033
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1044
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition Unit.cpp:20158
Powers getPowerType() const
Definition Unit.h:1054
void RemoveMovementImpairingAuras(bool withRoot)
Definition Unit.cpp:5303
Definition SpellMgr.h:554
SpellInfo const * last
Definition SpellMgr.h:558
uint8 rank
Definition SpellMgr.h:559
SpellInfo const * first
Definition SpellMgr.h:557

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellChainNode::first, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2028{
2030 packet.EmoteID = emoteId;
2031 packet.Guid = GetGUID();
2032 SendMessageToSet(packet.Write(), true);
2033}
Definition ChatPackets.h:29
WorldPacket const * Write() override
Definition ChatPackets.cpp:20
uint32 EmoteID
Definition ChatPackets.h:35
ObjectGuid Guid
Definition ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), spell_chapter5_return_to_capital::HandleHit(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleGroundAbilities(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9936{
9937 int32 scriptId = triggeredByAura->GetMiscValue();
9938
9939 if (!victim || !victim->IsAlive())
9940 return false;
9941
9942 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9943 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9944
9945 uint32 triggered_spell_id = 0;
9946
9947 switch (scriptId)
9948 {
9949 case 836: // Improved Blizzard (Rank 1)
9950 {
9951 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9952 return false;
9953 triggered_spell_id = 12484;
9954 break;
9955 }
9956 case 988: // Improved Blizzard (Rank 2)
9957 {
9958 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9959 return false;
9960 triggered_spell_id = 12485;
9961 break;
9962 }
9963 case 989: // Improved Blizzard (Rank 3)
9964 {
9965 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9966 return false;
9967 triggered_spell_id = 12486;
9968 break;
9969 }
9970 case 4533: // Dreamwalker Raiment 2 pieces bonus
9971 {
9972 // Chance 50%
9973 if (!roll_chance_i(50))
9974 return false;
9975
9976 switch (victim->getPowerType())
9977 {
9978 case POWER_MANA:
9979 triggered_spell_id = 28722;
9980 break;
9981 case POWER_RAGE:
9982 triggered_spell_id = 28723;
9983 break;
9984 case POWER_ENERGY:
9985 triggered_spell_id = 28724;
9986 break;
9987 default:
9988 return false;
9989 }
9990 break;
9991 }
9992 case 4537: // Dreamwalker Raiment 6 pieces bonus
9993 triggered_spell_id = 28750; // Blessing of the Claw
9994 break;
9995 case 5497: // Improved Mana Gems
9996 triggered_spell_id = 37445; // Mana Surge
9997 break;
9998 case 7010: // Revitalize - can proc on full hp target
9999 case 7011:
10000 case 7012:
10001 {
10002 if (!roll_chance_i(triggeredByAura->GetAmount()))
10003 return false;
10004 switch (victim->getPowerType())
10005 {
10006 case POWER_MANA:
10007 triggered_spell_id = 48542;
10008 break;
10009 case POWER_RAGE:
10010 triggered_spell_id = 48541;
10011 break;
10012 case POWER_ENERGY:
10013 triggered_spell_id = 48540;
10014 break;
10015 case POWER_RUNIC_POWER:
10016 triggered_spell_id = 48543;
10017 break;
10018 default:
10019 break;
10020 }
10021 break;
10022 }
10023 default:
10024 break;
10025 }
10026
10027 // not processed
10028 if (!triggered_spell_id)
10029 return false;
10030
10031 // standard non-dummy case
10032 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
10033
10034 if (!triggerEntry)
10035 {
10036 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
10037 return false;
10038 }
10039
10040 if (cooldown)
10041 {
10042 if (HasSpellCooldown(triggered_spell_id))
10043 return false;
10044
10045 AddSpellCooldown(triggered_spell_id, 0, cooldown);
10046 }
10047
10048 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
10049
10050 return true;
10051}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2788{
2789 while (count)
2790 {
2791 --count;
2792 AttackerStateUpdate(victim, BASE_ATTACK, true);
2793 }
2794}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2592

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
9011{
9012 // Get triggered aura spell info
9013 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
9014
9015 // Basepoints of trigger aura
9016 int32 triggerAmount = triggeredByAura->GetAmount();
9017
9018 // Set trigger spell id, target, custom basepoints
9019 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
9020
9021 Unit* target = nullptr;
9022 int32 basepoints0 = 0;
9023
9024 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
9025 basepoints0 = triggerAmount;
9026
9027 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9028 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9029
9030 // Try handle unknown trigger spells
9031 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
9032 {
9033 switch (auraSpellInfo->SpellFamilyName)
9034 {
9036 switch (auraSpellInfo->Id)
9037 {
9038 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
9039 // Pct value stored in dummy
9040 if (!victim)
9041 return false;
9042 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
9043 target = victim;
9044 break;
9045 case 57345: // Darkmoon Card: Greatness
9046 {
9047 float stat = 0.0f;
9048 // strength
9049 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
9050 // agility
9051 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
9052 // intellect
9053 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
9054 // spirit
9055 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
9056 break;
9057 }
9058 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
9059 {
9060 if (!damage)
9061 return false;
9062 float stat = 0.0f;
9063 // strength
9064 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
9065 // agility
9066 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
9067 break;
9068 }
9069 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
9070 {
9071 if (!damage)
9072 return false;
9073 float stat = 0.0f;
9074 // strength
9075 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
9076 // agility
9077 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
9078 break;
9079 }
9080 case 27522: // Mana Drain Trigger
9081 case 40336: // Mana Drain Trigger
9082 case 46939: // Black Bow of the Betrayer
9083 {
9084 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9085 if (IsAlive())
9086 CastSpell(this, 29471, true, castItem, triggeredByAura);
9087 if (victim && victim->IsAlive())
9088 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9089 return true;
9090 }
9091 // Forge of Souls, Devourer of Souls, Mirrored Soul
9092 case 69023:
9093 {
9094 int32 dmg = damage * 0.45f;
9095 if (dmg > 0)
9096 if (Aura* a = GetAura(69023))
9097 if (Unit* c = a->GetCaster())
9098 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9099 return true;
9100 }
9101 // Soul-Trader Beacon proc aura
9102 case 50051:
9103 {
9104 if (!victim)
9105 return false;
9106
9107 if (Creature* cr = GetCompanionPet())
9108 cr->CastSpell(victim, 50101, true);
9109
9110 return false;
9111 }
9112 }
9113 break;
9114 case SPELLFAMILY_MAGE:
9115 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9116 {
9117 switch (auraSpellInfo->Id)
9118 {
9119 case 31641: // Rank 1
9120 case 31642: // Rank 2
9121 trigger_spell_id = 31643;
9122 break;
9123 default:
9124 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9125 return false;
9126 }
9127 }
9128 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9129 {
9130 Creature* creature = victim->ToCreature();
9131 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9132 return false;
9133 }
9134 break;
9136 {
9137 // Nether Protection
9138 if (auraSpellInfo->SpellIconID == 1985)
9139 {
9140 if (!procSpell)
9141 return false;
9142 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9143 {
9145 return false; // ignore
9146 case SPELL_SCHOOL_HOLY:
9147 trigger_spell_id = 54370;
9148 break;
9149 case SPELL_SCHOOL_FIRE:
9150 trigger_spell_id = 54371;
9151 break;
9153 trigger_spell_id = 54375;
9154 break;
9155 case SPELL_SCHOOL_FROST:
9156 trigger_spell_id = 54372;
9157 break;
9159 trigger_spell_id = 54374;
9160 break;
9162 trigger_spell_id = 54373;
9163 break;
9164 default:
9165 return false;
9166 }
9167 }
9168 break;
9169 }
9170 case SPELLFAMILY_PRIEST:
9171 {
9172 // Blessed Recovery
9173 if (auraSpellInfo->SpellIconID == 1875)
9174 {
9175 switch (auraSpellInfo->Id)
9176 {
9177 case 27811:
9178 trigger_spell_id = 27813;
9179 break;
9180 case 27815:
9181 trigger_spell_id = 27817;
9182 break;
9183 case 27816:
9184 trigger_spell_id = 27818;
9185 break;
9186 default:
9187 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9188 return false;
9189 }
9190 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9191 target = this;
9192 // Add remaining ticks to healing done
9193 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9194 return true;
9195 }
9196 break;
9197 }
9198 case SPELLFAMILY_DRUID:
9199 {
9200 switch (auraSpellInfo->Id)
9201 {
9202 // Druid Forms Trinket
9203 case 37336:
9204 {
9205 switch (GetShapeshiftForm())
9206 {
9207 case FORM_NONE:
9208 trigger_spell_id = 37344;
9209 break;
9210 case FORM_CAT:
9211 trigger_spell_id = 37341;
9212 break;
9213 case FORM_BEAR:
9214 case FORM_DIREBEAR:
9215 trigger_spell_id = 37340;
9216 break;
9217 case FORM_TREE:
9218 trigger_spell_id = 37342;
9219 break;
9220 case FORM_MOONKIN:
9221 trigger_spell_id = 37343;
9222 break;
9223 default:
9224 return false;
9225 }
9226 break;
9227 }
9228 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9229 case 67353:
9230 {
9231 switch (GetShapeshiftForm())
9232 {
9233 case FORM_CAT:
9234 trigger_spell_id = 67355;
9235 break;
9236 case FORM_BEAR:
9237 case FORM_DIREBEAR:
9238 trigger_spell_id = 67354;
9239 break;
9240 default:
9241 return false;
9242 }
9243 break;
9244 }
9245 default:
9246 break;
9247 }
9248 break;
9249 }
9250 case SPELLFAMILY_HUNTER:
9251 {
9252 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9253 {
9254 if (!victim)
9255 return false;
9256
9257 switch (auraSpellInfo->Id)
9258 {
9259 case 53234: // Rank 1
9260 case 53237: // Rank 2
9261 case 53238: // Rank 3
9262 trigger_spell_id = 63468;
9263 break;
9264 default:
9265 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9266 return false;
9267 }
9268 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9269 if (!TriggerPS)
9270 return false;
9271
9272 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9273 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9274 return true;
9275 }
9276 // Item - Hunter T9 4P Bonus (Steady Shot)
9277 else if (auraSpellInfo->Id == 67151)
9278 {
9279 if (!IsPlayer() || !ToPlayer()->GetPet())
9280 return false;
9281
9282 target = ToPlayer()->GetPet();
9283 trigger_spell_id = 68130;
9284 break;
9285 }
9286 break;
9287 }
9289 {
9290 switch (auraSpellInfo->Id)
9291 {
9292 // Soul Preserver
9293 case 60510:
9294 {
9295 switch (getClass())
9296 {
9297 case CLASS_DRUID:
9298 trigger_spell_id = 60512;
9299 break;
9300 case CLASS_PALADIN:
9301 trigger_spell_id = 60513;
9302 break;
9303 case CLASS_PRIEST:
9304 trigger_spell_id = 60514;
9305 break;
9306 case CLASS_SHAMAN:
9307 trigger_spell_id = 60515;
9308 break;
9309 }
9310
9311 target = this;
9312 break;
9313 }
9314 case 37657: // Lightning Capacitor
9315 case 54841: // Thunder Capacitor
9316 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9317 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9318 {
9319 if (!victim || !victim->IsAlive() || !IsPlayer())
9320 return false;
9321
9322 uint32 stack_spell_id = 0;
9323 switch (auraSpellInfo->Id)
9324 {
9325 case 37657:
9326 stack_spell_id = 37658;
9327 trigger_spell_id = 37661;
9328 break;
9329 case 54841:
9330 stack_spell_id = 54842;
9331 trigger_spell_id = 54843;
9332 break;
9333 case 67712:
9334 stack_spell_id = 67713;
9335 trigger_spell_id = 67714;
9336 break;
9337 case 67758:
9338 stack_spell_id = 67759;
9339 trigger_spell_id = 67760;
9340 break;
9341 }
9342
9343 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9344 {
9345 return false;
9346 }
9347
9348 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9349
9350 Aura* dummy = GetAura(stack_spell_id);
9351 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9352 {
9353 return false;
9354 }
9355
9356 if (cooldown)
9357 {
9358 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9359 }
9360 RemoveAurasDueToSpell(stack_spell_id);
9361 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9362 return true;
9363 }
9364 default:
9365 // Illumination
9366 if (auraSpellInfo->SpellIconID == 241)
9367 {
9368 if (!procSpell)
9369 return false;
9370 // procspell is triggered spell but we need mana cost of original casted spell
9371 uint32 originalSpellId = procSpell->Id;
9372 // Holy Shock heal
9373 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9374 {
9375 switch (procSpell->Id)
9376 {
9377 case 25914:
9378 originalSpellId = 20473;
9379 break;
9380 case 25913:
9381 originalSpellId = 20929;
9382 break;
9383 case 25903:
9384 originalSpellId = 20930;
9385 break;
9386 case 27175:
9387 originalSpellId = 27174;
9388 break;
9389 case 33074:
9390 originalSpellId = 33072;
9391 break;
9392 case 48820:
9393 originalSpellId = 48824;
9394 break;
9395 case 48821:
9396 originalSpellId = 48825;
9397 break;
9398 default:
9399 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9400 return false;
9401 }
9402 }
9403 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9404 if (!originalSpell)
9405 {
9406 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9407 return false;
9408 }
9409 // percent stored in effect 1 (class scripts) base points
9410 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9411 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9412 trigger_spell_id = 20272;
9413 target = this;
9414 }
9415 break;
9416 }
9417 break;
9418 }
9419 case SPELLFAMILY_SHAMAN:
9420 {
9421 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9422 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9423 {
9424 // Do not proc off from self-casted items
9425 if (Spell const* spell = eventInfo.GetProcSpell())
9426 {
9427 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9428 {
9429 return false;
9430 }
9431 }
9432
9433 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9434 }
9435 // Nature's Guardian
9436 else if (auraSpellInfo->SpellIconID == 2013)
9437 {
9438 // Check health condition - should drop to less 30% (damage deal after this!)
9439 if (!HealthBelowPctDamaged(30, damage))
9440 return false;
9441
9442 if (victim && victim->IsAlive())
9443 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9444
9445 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9446 trigger_spell_id = 31616;
9447 target = this;
9448 }
9449 break;
9450 }
9452 {
9453 // Acclimation
9454 if (auraSpellInfo->SpellIconID == 1930)
9455 {
9456 if (!procSpell)
9457 return false;
9458 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9459 {
9461 return false; // ignore
9462 case SPELL_SCHOOL_HOLY:
9463 trigger_spell_id = 50490;
9464 break;
9465 case SPELL_SCHOOL_FIRE:
9466 trigger_spell_id = 50362;
9467 break;
9469 trigger_spell_id = 50488;
9470 break;
9471 case SPELL_SCHOOL_FROST:
9472 trigger_spell_id = 50485;
9473 break;
9475 trigger_spell_id = 50489;
9476 break;
9478 trigger_spell_id = 50486;
9479 break;
9480 default:
9481 return false;
9482 }
9483 }
9484 // Blood Presence (Improved)
9485 else if (auraSpellInfo->Id == 63611)
9486 {
9487 if (!IsPlayer())
9488 return false;
9489
9490 trigger_spell_id = 50475;
9491 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9492 }
9493 break;
9494 }
9495 }
9496 }
9497
9498 // All ok. Check current trigger spell
9499 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9500 if (!triggerEntry)
9501 {
9502 // Don't cast unknown spell
9503 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9504 return false;
9505 }
9506
9507 // not allow proc extra attack spell at extra attack
9508 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9509 {
9510 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9511
9512 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9513 if (lastExtraAttackSpell == trigger_spell_id)
9514 {
9515 return false;
9516 }
9517
9518 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9519 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9520 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9521 {
9522 return false;
9523 }
9524 }
9525
9526 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9527 // Custom triggered spells
9528 switch (auraSpellInfo->Id)
9529 {
9530 // Deep Wounds
9531 case 12834:
9532 case 12849:
9533 case 12867:
9534 {
9535 if (!IsPlayer())
9536 return false;
9537
9538 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9540 else
9542 break;
9543 }
9544 // Persistent Shield (Scarab Brooch trinket)
9545 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9546 case 26467:
9547 {
9548 basepoints0 = int32(CalculatePct(damage, 15));
9549 target = victim;
9550 trigger_spell_id = 26470;
9551 break;
9552 }
9553 // Unyielding Knights (item exploit 29108\29109)
9554 case 38164:
9555 {
9556 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9557 return false;
9558 break;
9559 }
9560 // Deflection
9561 case 52420:
9562 {
9563 if (!HealthBelowPct(35))
9564 return false;
9565 break;
9566 }
9567
9568 // Cheat Death
9569 case 28845:
9570 {
9571 // When your health drops below 20%
9572 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9573 return false;
9574 break;
9575 }
9576 // Deadly Swiftness (Rank 1)
9577 case 31255:
9578 {
9579 // whenever you deal damage to a target who is below 20% health.
9580 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9581 return false;
9582
9583 target = this;
9584 trigger_spell_id = 22588;
9585 [[fallthrough]];
9586 }
9587 // Bonus Healing (Crystal Spire of Karabor mace)
9588 case 40971:
9589 {
9590 // If your target is below $s1% health
9591 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9592 return false;
9593 break;
9594 }
9595 // Rapid Recuperation
9596 case 53228:
9597 case 53232:
9598 {
9599 // This effect only from Rapid Fire (ability cast)
9600 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9601 return false;
9602 break;
9603 }
9604 // Decimation
9605 case 63156:
9606 case 63158:
9607 // Can proc only if target has hp below 35%
9608 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9609 return false;
9610 break;
9611 // Ulduar, Hodir, Toasty Fire
9612 case 62821:
9613 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9614 return false;
9615 break;
9616 case 15337: // Improved Spirit Tap (Rank 1)
9617 case 15338: // Improved Spirit Tap (Rank 2)
9618 {
9619 if (!procSpell)
9620 return false;
9621
9622 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9623 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9624 return false;
9625
9626 target = victim;
9627 break;
9628 }
9629 // Professor Putricide - Ooze Spell Tank Protection
9630 case 71770:
9631 if (victim)
9632 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9633 return true;
9634 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9635 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9636 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9637 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9638 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9639 {
9640 // Procs only if damage takes health below $s1%
9641 if (!HealthBelowPctDamaged(triggerAmount, damage))
9642 return false;
9643 break;
9644 }
9645 default:
9646 break;
9647 }
9648
9649 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9650 {
9651 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9652 // Item - Death Knight T10 Melee 4P Bonus
9653 if (auraSpellInfo->Id == 70656)
9654 {
9656 return false;
9657
9658 for (uint8 i = 0; i < MAX_RUNES; ++i)
9659 if (ToPlayer()->GetRuneCooldown(i) == 0)
9660 return false;
9661 }
9662 // Blade Barrier
9663 else if (auraSpellInfo->SpellIconID == 85)
9664 {
9665 Player* plr = ToPlayer();
9666 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9667 return false;
9668
9670 return false;
9671 }
9672 // Rime
9673 else if (auraSpellInfo->SpellIconID == 56)
9674 {
9675 if (!IsPlayer())
9676 return false;
9677
9678 // Howling Blast
9680 }
9681 }
9682
9683 // Custom basepoints/target for exist spell
9684 // dummy basepoints or other customs
9685 switch (trigger_spell_id)
9686 {
9687 // Auras which should proc on area aura source (caster in this case):
9688 // Turn the Tables
9689 case 52914:
9690 case 52915:
9691 case 52910:
9692 // Honor Among Thieves
9693 case 51699:
9694 {
9695 target = triggeredByAura->GetBase()->GetCaster();
9696 if (!target)
9697 return false;
9698
9699 if (Player* pTarget = target->ToPlayer())
9700 {
9701 if (cooldown)
9702 {
9703 if (pTarget->HasSpellCooldown(trigger_spell_id))
9704 return false;
9705 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9706 }
9707
9708 Unit* cptarget = nullptr;
9709 if (trigger_spell_id == 51699)
9710 {
9711 cptarget = pTarget->GetComboTarget();
9712 if (!cptarget)
9713 {
9714 cptarget = pTarget->GetSelectedUnit();
9715 }
9716 }
9717 else
9718 cptarget = target;
9719
9720 if (cptarget)
9721 {
9722 target->CastSpell(cptarget, trigger_spell_id, true);
9723 return true;
9724 }
9725 }
9726 return false;
9727 }
9728 // Cast positive spell on enemy target
9729 case 20233: // Improved Lay on Hands (cast on target)
9730 {
9731 target = victim;
9732 break;
9733 }
9734 // Ruby Drake, Evasive Aura
9735 case 50241:
9736 {
9737 if (GetAura(50240))
9738 return false;
9739
9740 break;
9741 }
9742 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9743 case 15250: // Rogue Setup
9744 {
9745 // applied only for main target
9746 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9747 return false;
9748 break; // continue normal case
9749 }
9750 // Finish movies that add combo
9751 case 14189: // Seal Fate (Netherblade set)
9752 case 14157: // Ruthlessness
9753 {
9754 victim = nullptr;
9755 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9756 break;
9757 }
9758 // Item - Druid T10 Balance 2P Bonus
9759 case 16870:
9760 {
9761 if (HasAura(70718))
9762 CastSpell(this, 70721, true);
9763 RemoveAurasDueToSpell(trigger_spell_id);
9764 break;
9765 }
9766 // Shamanistic Rage triggered spell
9767 case 30824:
9768 {
9769 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9770 break;
9771 }
9772 // Enlightenment (trigger only from mana cost spells)
9773 case 35095:
9774 {
9775 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9776 return false;
9777 break;
9778 }
9779 case 46916: // Slam! (Bloodsurge proc)
9780 case 52437: // Sudden Death
9781 {
9782 // Item - Warrior T10 Melee 4P Bonus
9783 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9784 {
9785 if (!roll_chance_i(aurEff->GetAmount()))
9786 {
9787 // Xinef: dont allow normal proc to override set one
9788 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9789 return false;
9790 // Xinef: just to be sure
9791 RemoveAurasDueToSpell(70849);
9792 break;
9793 }
9794
9795 // Xinef: fully remove all auras and reapply once more
9796 RemoveAurasDueToSpell(70849);
9797 RemoveAurasDueToSpell(71072);
9798 RemoveAurasDueToSpell(71069);
9799
9800 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9801 if (trigger_spell_id == 46916)
9802 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9803 else
9804 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9805 }
9806 break;
9807 }
9808 // Sword and Board
9809 case 50227:
9810 {
9811 // Remove cooldown on Shield Slam
9812 if (IsPlayer())
9814 break;
9815 }
9816 // Maelstrom Weapon
9817 case 53817:
9818 {
9819 // have rank dependent proc chance, ignore too often cases
9820 // PPM = 2.5 * (rank of talent),
9821 uint32 rank = auraSpellInfo->GetRank();
9822 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9823 if (!roll_chance_i(20 * rank))
9824 return false;
9825
9826 // Item - Shaman T10 Enhancement 4P Bonus
9827 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9828 if (Aura const* maelstrom = GetAura(53817))
9829 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9830 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9831 CastSpell(this, 70831, true, castItem, triggeredByAura);
9832
9833 break;
9834 }
9835 // Astral Shift
9836 case 52179:
9837 {
9838 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9839 return false;
9840
9841 // Need stun, fear or silence mechanic
9842 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9843 return false;
9844 break;
9845 }
9846 // Glyph of Death's Embrace
9847 case 58679:
9848 {
9849 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9850 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9851 return false;
9852 break;
9853 }
9854 // Glyph of Death Grip
9855 case 58628:
9856 {
9857 // remove cooldown of Death Grip
9858 if (IsPlayer())
9859 ToPlayer()->RemoveSpellCooldown(49576, true);
9860 return true;
9861 }
9862 // Savage Defense
9863 case 62606:
9864 {
9865 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9866 break;
9867 }
9868 // Body and Soul
9869 case 64128:
9870 case 65081:
9871 {
9872 // Proc only from PW:S cast
9873 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9874 return false;
9875 break;
9876 }
9877 // Culling the Herd
9878 case 70893:
9879 {
9880 if (!procSpell)
9881 {
9882 return false;
9883 }
9884 // check if we're doing a critical hit
9885 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9886 return false;
9887 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9888 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9889 return false;
9890 break;
9891 }
9892 // Fingers of Frost, synchronise with Frostbite
9893 case 44544:
9894 {
9895 if (procPhase == PROC_SPELL_PHASE_HIT)
9896 {
9897 // Find Frostbite
9899 {
9900 if (!victim)
9901 return false;
9902
9903 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9904 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9905 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9906
9907 if (roll_chance_i(chance))
9908 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9909 }
9910 }
9911 break;
9912 }
9913 }
9914
9915 // try detect target manually if not set
9916 if (!target)
9917 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9918
9919 if (cooldown)
9920 {
9921 if (HasSpellCooldown(triggerEntry->Id))
9922 return false;
9923
9924 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9925 }
9926
9927 if (basepoints0)
9928 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9929 else
9930 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9931
9932 return true;
9933}
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition SharedDefines.h:808
@ SPELL_ATTR1_NO_THREAT
Definition SharedDefines.h:440
@ MECHANIC_FEAR
Definition SharedDefines.h:1341
@ MECHANIC_SILENCE
Definition SharedDefines.h:1345
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition SharedDefines.h:1316
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition SpellMgr.h:244
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_MOONKIN
Definition UnitDefines.h:98
@ FORM_NONE
Definition UnitDefines.h:69
@ FORM_CAT
Definition UnitDefines.h:70
@ FORM_TREE
Definition UnitDefines.h:71
@ FORM_BEAR
Definition UnitDefines.h:74
@ SPELL_HACK_AND_SLASH
Definition Unit.h:293
@ SPELL_SWORD_SPECIALIZATION
Definition Unit.h:292
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition Creature.cpp:2216
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition Player.cpp:13504
void RemoveCategoryCooldown(uint32 cat)
Definition Player.cpp:3556
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1295
Spell const * GetProcSpell() const
Definition Unit.h:449
Unit * GetActor()
Definition Unit.h:440
uint8 GetRank() const
Definition SpellInfo.cpp:2506
uint32 ManaCostPercentage
Definition SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition SpellInfo.cpp:876
uint32 ManaCost
Definition SpellInfo.h:363
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition ThreatMgr.cpp:508
bool HealthAbovePct(int32 pct) const
Definition Unit.h:1041
Creature * GetCompanionPet() const
Definition Unit.cpp:10765
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15533
uint32 GetLastExtraAttackSpell() const
Definition Unit.h:949
uint32 GetCreateHealth() const
Definition Unit.h:1035
Unit * GetComboTarget() const
Definition Unit.h:955
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:1040

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_PRIEST, CLASS_SHAMAN, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), getClass(), GetComboTarget(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4399{
4400 if (thisUnit->SafeUnitPointerSet.empty())
4401 return;
4402 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4403 (*itr)->UnitDeleted();
4404
4405 thisUnit->SafeUnitPointerSet.clear();
4406}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19389{
19390 Creature* creature = ToCreature();
19391 if (creature && creature->IsAIEnabled)
19392 {
19393 if (!creature->AI()->BeforeSpellClick(clicker))
19394 {
19395 return false;
19396 }
19397 }
19398
19399 bool result = false;
19400 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19401 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19402 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19403 {
19405 if (!itr->second.IsFitToRequirements(clicker, this))
19406 continue;
19407
19409 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19410 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19411 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19412 continue;
19413
19414 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19415 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19416 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19417
19418 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19419
19420 // xinef: dont allow players to enter vehicles on arena
19421 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19422 continue;
19423
19424 if (seatId > -1)
19425 {
19426 uint8 i = 0;
19427 bool valid = false;
19428 while (i < MAX_SPELL_EFFECTS)
19429 {
19430 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19431 {
19432 valid = true;
19433 break;
19434 }
19435 ++i;
19436 }
19437
19438 if (!valid)
19439 {
19440 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19441 continue;
19442 }
19443
19444 if (IsInMap(caster))
19445 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19446 else // This can happen during Player::_LoadAuras
19447 {
19449 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19450 bp0[j] = spellInfo->Effects[j].BasePoints;
19451
19452 bp0[i] = seatId;
19453 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19454 }
19455 }
19456 else
19457 {
19458 if (IsInMap(caster))
19459 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19460 else
19461 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19462 }
19463
19464 result = true;
19465 }
19466
19467 if (creature && creature->IsAIEnabled)
19468 creature->AI()->OnSpellClick(clicker, result);
19469
19470 return result;
19471}
#define sConditionMgr
Definition ConditionMgr.h:291
std::list< Condition * > ConditionList
Definition ConditionMgr.h:238
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:408
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition SharedDefines.h:702
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition SharedDefines.h:703
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition SharedDefines.h:701
SpellValueMod
Definition SpellDefines.h:112
virtual void OnSpellClick(Unit *, bool &)
Definition CreatureAI.h:207
virtual bool BeforeSpellClick(Unit *)
Definition CreatureAI.h:205
bool IsBattleArena() const
Definition Map.h:299
bool HasAura(AuraType aura) const
Definition SpellInfo.cpp:893
uint32 GetCreatureEntry() const
Definition Vehicle.h:39
Map * FindMap() const
Definition Object.h:622
Definition ConditionMgr.h:183

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15309{
15310 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15311 {
15312 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15313 return false;
15314 }
15315
15316 switch (modifierType)
15317 {
15318 case BASE_VALUE:
15319 case TOTAL_VALUE:
15320 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15321 break;
15322 case BASE_PCT:
15323 case TOTAL_PCT:
15324 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15325 break;
15326 default:
15327 break;
15328 }
15329
15330 if (!CanModifyStats())
15331 return false;
15332
15333 switch (unitMod)
15334 {
15341 break;
15342
15343 case UNIT_MOD_ARMOR:
15344 UpdateArmor();
15345 break;
15346 case UNIT_MOD_HEALTH:
15348 break;
15349
15350 case UNIT_MOD_MANA:
15351 case UNIT_MOD_RAGE:
15352 case UNIT_MOD_FOCUS:
15353 case UNIT_MOD_ENERGY:
15354 case UNIT_MOD_HAPPINESS:
15355 case UNIT_MOD_RUNE:
15358 break;
15359
15367 break;
15368
15371 break;
15374 break;
15375
15378 break;
15381 break;
15384 break;
15385
15386 default:
15387 break;
15388 }
15389
15390 return true;
15391}
@ UNIT_MOD_ARMOR
Definition Unit.h:157
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:164
@ UNIT_MOD_HEALTH
Definition Unit.h:149
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:168
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:166
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:165
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15450
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15482
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15511
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition Unit.h:1020
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAllAuras()

template<typename... Auras>
bool Unit::HasAllAuras ( Auras...  spellIds) const
inline

Checks if the unit has ALL specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ALL of the specified auras. Otherwise false.
1411 {
1412 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1413 return HasAuras(SearchMethod::MatchAll, spellList);
1414 }
bool HasAuras(SearchMethod sm, std::vector< uint32 > &spellIds) const
Check if unit has ANY or ALL specified auras.
Definition Unit.cpp:5767

References HasAuras(), and MatchAll.

Referenced by achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), npc_alchemist_adrianna::OnGossipHello(), and npc_nelson::npc_nelsonAI::SpellHit().

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition Unit.cpp:5797

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAnyAuras()

template<typename... Auras>
bool Unit::HasAnyAuras ( Auras...  spellIds) const
inline

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5791{
5792 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5793 return true;
5794 return false;
5795}

References GetAuraApplication().

Referenced by boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyItemObtainSpells(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_leotheras_the_blind::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_jenny::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), Spell::finish(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), Player::GetResurrectionSpellId(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_braziers_hit::HandleAfterEffectApply(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), HasAuras(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), boss_krik_thir::boss_krik_thirAI::IsInFrenzy(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::JustDied(), npc_sunblade_scout::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::boss_bjarngrimAI::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_faerlina::boss_faerlinaAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_felmyst::MovementInform(), boss_kagani_nightstrike::MovementInform(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), DefaultTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_necropolis::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_dark_fiend::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5738{
5739 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5740 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5741 {
5742 if (itr->second->HasEffect(effIndex)
5743 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5744 {
5745 return true;
5746 }
5747 }
5748 return false;
5749}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuras()

bool Unit::HasAuras ( SearchMethod  sm,
std::vector< uint32 > &  spellIds 
) const

Check if unit has ANY or ALL specified auras.

Parameters
smThe search method to use
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the search method condition is met. Otherwise false.
5768{
5769 if (sm == SearchMethod::MatchAll)
5770 {
5771 for (auto const& spellId : spellIds)
5772 if (!HasAura(spellId))
5773 return false;
5774 return true;
5775 }
5776 else if (sm == SearchMethod::MatchAny)
5777 {
5778 for (auto const& spellId : spellIds)
5779 if (HasAura(spellId))
5780 return true;
5781 return false;
5782 }
5783 else
5784 {
5785 LOG_ERROR("entities.unit", "Unit::HasAuras using non-supported SearchMethod {}", sm);
5786 return false;
5787 }
5788}

References HasAura(), LOG_ERROR, MatchAll, and MatchAny.

Referenced by HasAllAuras(), and HasAnyAuras().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10647{
10648 if (Caster)
10649 {
10650 if (spellProto)
10651 {
10652 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10653 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10654 if ((*j)->IsAffectedOnSpell(spellProto))
10655 return true;
10656 }
10657 // Check per caster aura state
10658 // If aura with aurastate by caster not found return false
10659 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10660 {
10661 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10662 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10663 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10664 return true;
10665 return false;
10666 }
10667 }
10668
10669 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10670}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition Unit.h:634

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5798{
5799 return (!m_modAuras[auraType].empty());
5800}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), and HasWaterWalkAura().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5831{
5832 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5833 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5834 if ((*i)->IsAffectedOnSpell(affectedSpell))
5835 return true;
5836 return false;
5837}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5803{
5804 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5805 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5806 if (caster == (*i)->GetCasterGUID())
5807 return true;
5808 return false;
5809}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
781{
782 if (!HasAuraType(auraType))
783 return false;
784 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
785 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
786 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
787 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
788 return true;
789 return false;
790}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5822{
5823 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5824 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5825 if (miscvalue == (*i)->GetMiscValue())
5826 return true;
5827 return false;
5828}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5849{
5850 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5851 {
5852 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5853 {
5854 return true;
5855 }
5856 }
5857
5858 return false;
5859}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5840{
5841 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5842 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5843 if (value == (*i)->GetAmount())
5844 return true;
5845 return false;
5846}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5885{
5886 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5887 {
5888 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5889 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5890 return true;
5891
5892 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5893 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5894 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5895 return true;
5896 }
5897
5898 return false;
5899}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
793{
794 AuraEffectList const& auras = GetAuraEffectsByType(type);
795 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
796 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
797 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
798 return true;
799 return false;
800}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
803{
804 uint32 excludeAura = 0;
805 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
806 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
807
813}
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition Unit.cpp:792
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1495

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::GetAurasForTarget(), and Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1716{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::GetAurasForTarget(), Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasLeewayMovement()

bool Unit::HasLeewayMovement ( ) const
inline
1643 {
1645 && !IsWalking();
1646 }
@ MOVEMENTFLAG_STRAFE_LEFT
Definition UnitDefines.h:367
@ MOVEMENTFLAG_STRAFE_RIGHT
Definition UnitDefines.h:368
bool IsWalking() const
Definition Unit.h:1621
bool HasMovementFlag(uint32 flag) const
Definition Object.h:346

References MovementInfo::HasMovementFlag(), IsWalking(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_STRAFE_LEFT, and MOVEMENTFLAG_STRAFE_RIGHT.

Referenced by Spell::CheckRange(), and IsWithinMeleeRange().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
922{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:927

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5874{
5875 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5876 {
5877 Aura const* aura = iter->second->GetBase();
5878 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5879 return true;
5880 }
5881 return false;
5882}
uint32 Attributes
Definition SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5862{
5863 if (!(m_interruptMask & flag))
5864 return false;
5865 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5866 {
5867 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5868 return true;
5869 }
5870 return false;
5871}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
923{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
924{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1263{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
702{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMovementOpcodes(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), CreatureGroup::LeaderMoveTo(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), MotionMaster::MovePath(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), boss_the_lurker_below::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), and npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
691{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_hexlord_malacrass::boss_hexlord_malacrass(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_kiljaeden::boss_kiljaeden(), boss_krik_thir::boss_krik_thirAI::boss_krik_thirAI(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_taldaram::boss_taldaram(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_tenris_mirkblood::boss_tenris_mirkblood(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), BossAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), Creature::IsUpdateNeeded(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), GridObjectLoader::LoadCreatures(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), npc_sunblade_arch_mage::npc_sunblade_arch_mage(), Acore::FriendlyCCedInRange::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), ThreatContainer::SelectNextVictim(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), Creature::SetDisableGravity(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Creature::SetHover(), SetInCombatState(), SetInFront(), SetRooted(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Creature::Update(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_enslaved_netherwing_drake::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5812{
5813 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5814 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5815 if ((*i)->GetBase()->CanBeSentToClient())
5816 return true;
5817
5818 return false;
5819}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

927{ return CanUseAttackType(type); }
bool CanUseAttackType(uint8 attacktype) const
Definition Unit.h:931

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
524{
525 if (Player const* player = ToPlayer())
526 return player->GetWeaponForAttack(OFF_ATTACK, true);
527
528 return CanDualWield();
529}
bool CanDualWield() const
Definition Unit.h:918

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11341{
11342 uint32 heal = healInfo.GetHeal();
11343 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11344 healInfo.SetHeal(heal);
11345
11346 // calculate heal absorb and reduce healing
11347 CalcHealAbsorb(healInfo);
11348
11349 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11350 healInfo.SetEffectiveHeal(gain);
11351
11352 SendHealSpellLog(healInfo, critical);
11353 return gain;
11354}
Unit * GetHealer() const
Definition Unit.h:411
void SetHeal(uint32 amount)
Definition Unit.h:401
void SetEffectiveHeal(uint32 amount)
Definition Unit.h:406
static void CalcHealAbsorb(HealInfo &healInfo)
Definition Unit.cpp:2529
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition Unit.cpp:11050
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition Unit.cpp:11323

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1039{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1040{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_halazzi::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15139{
15140 // Checking for existing in the table
15141 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15142 {
15143 if (i->DRGroup != group)
15144 continue;
15145 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15146 i->hitCount += 1;
15147 return;
15148 }
15150}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition SpellMgr.cpp:264
Definition Unit.h:273

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15903{
15904 if (!m_charmInfo)
15905 m_charmInfo = new CharmInfo(this);
15906
15907 return m_charmInfo;
15908}
Definition CharmInfo.h:127

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1009 {
1010 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1011 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1012 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17483{
17484 Player* player = ToPlayer();
17485 PetStable& petStable = player->GetOrInitPetStable();
17486 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17487 return false;
17488
17489 pet->SetCreatorGUID(GetGUID());
17490 pet->SetFaction(GetFaction());
17491 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17492
17493 if (IsPlayer())
17495
17496 if (!pet->InitStatsForLevel(level))
17497 {
17498 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17499 return false;
17500 }
17501
17502 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17503 // this enables pet details window (Shift+P)
17504 pet->InitPetCreateSpells();
17505 pet->SetFullHealth();
17506 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17507 return true;
17508}
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1018
Definition PetDefines.h:209
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:237
Optional< PetInfo > CurrentPet
Definition PetDefines.h:232
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2477
void InitPetCreateSpells()
Definition Pet.cpp:2052
PetStable & GetOrInitPetStable()
Definition Player.cpp:15608
void SetFullHealth()
Definition Unit.h:1049
void SetFaction(uint32 faction)
Definition Unit.cpp:10130
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition Unit.h:705
CharmInfo * GetCharmInfo()
Definition Unit.h:1208
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:671
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom(), and CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4190{
4191 // generic spells are interrupted if they are not finished or delayed
4192 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4193 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4194
4195 // autorepeat spells are interrupted if they are not finished or delayed
4196 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4197 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4198
4199 // channeled spells are interrupted if they are not finished, even if they are delayed
4200 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4201 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4202}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_akilzon::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_shade_of_aran::JustEngagedWith(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4109{
4110 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4111 Spell* spell = m_currentSpells[spellType];
4112 if (spell
4113 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4114 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4115 {
4116 // for example, do not let self-stun aura interrupt itself
4117 if (!spell->IsInterruptable())
4118 return;
4119
4120 // send autorepeat cancel message for autorepeat spells
4121 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4122 if (IsPlayer())
4124
4125 if (spell->getState() != SPELL_STATE_FINISHED)
4126 spell->cancel(bySelf);
4127 else
4128 {
4129 m_currentSpells[spellType] = nullptr;
4130 spell->SetReferencedFromCurrent(false);
4131 }
4132
4133 // SAI creatures only
4134 // Start chasing victim if they are spell casters (at least one SMC spell) if interrupted/silenced.
4135 if (IsCreature())
4136 {
4137 if (SmartAI* ai = dynamic_cast<SmartAI*>(ToCreature()->AI()))
4138 if (ai->CanChaseOnInterrupt())
4139 ai->SetCombatMove(true);
4140 }
4141
4142 if (IsCreature() && IsAIEnabled)
4144 }
4145}
@ SPELL_FINISHED_CANCELED
Definition Spell.h:98
@ SPELL_STATE_DELAYED
Definition Spell.h:238
virtual void OnSpellCastFinished(SpellInfo const *, SpellFinishReason)
Definition CreatureAI.h:151
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:152
Definition SmartAI.h:44
bool IsInterruptable() const
Definition Spell.h:571
int32 GetCastTime() const
Definition Spell.h:557
uint32 getState() const
Definition Spell.h:492
void cancel(bool bySelf=false)
Definition Spell.cpp:3716

References Creature::AI(), Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::GetSpellInfo(), Spell::getState(), IsAIEnabled, Object::IsCreature(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, CreatureAI::OnSpellCastFinished(), Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_FINISHED_CANCELED, SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, Object::ToCreature(), and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2140{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1707{ return (m_deathState == DeathState::Alive); };

References Alive, and m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), ResetToHomeOrientation::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), WorldSession::HandleMovementOpcodes(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), GridObjectLoader::LoadCreatures(), Player::LoadFromDB(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), SmartScript::ProcessAction(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_kiljaeden::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), BossAI::ScheduleEnrageTimer(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), npc_enslaved_proto_drake::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), Creature::SetDisableGravity(), SetFeared(), Creature::SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), npc_dark_iron_guzzler::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14320{
14322 return true;
14323
14324 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14325 return true;
14326
14327 if (Player* ownerPlayer = GetSpellModOwner())
14328 if (Player const* seerPlayer = seer->ToPlayer())
14329 {
14330 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14331 return true;
14332 }
14333
14334 return false;
14335}
@ SPELL_AURA_MOD_STALKED
Definition SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition Object.h:760

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

: Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.

Reimplemented from WorldObject.

14301{
14303 return true;
14304
14305 // Always seen by owner
14306 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14307 if (seer->GetGUID() == guid)
14308 return true;
14309
14310 if (Player const* seerPlayer = seer->ToPlayer())
14311 if (Unit* owner = GetOwner())
14312 if (Player* ownerPlayer = owner->ToPlayer())
14313 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14314 return true;
14315
14316 return false;
14317}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition Object.h:757

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition UnitDefines.h:327
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:718

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10562{
10564 return true;
10565
10566 if (!m_Controlled.empty())
10567 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10568 if ((*itr)->isAttackingPlayer())
10569 return true;
10570
10571 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10572 if (m_SummonSlot[i])
10573 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10574 if (summon->isAttackingPlayer())
10575 return true;
10576
10577 return false;
10578}
Creature * GetCreature(ObjectGuid const guid)
Definition Map.cpp:2364

References Map::GetCreature(), WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19349{
19350 // Mirroring clientside gameplay logic
19351 if (ShapeshiftForm form = GetShapeshiftForm())
19352 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19353 return entry->attackSpeed > 0;
19354
19355 return false;
19356}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition UnitDefines.h:336

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition UnitDefines.h:332

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

657{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3156{
3158 return true;
3159 return false;
3160}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline

◆ IsClass()

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
969 {
971 return entry->IsContestedGuardFaction();
972
973 return false;
974 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1235{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2036{
2037 // only physical spells damage gets reduced by armor
2038 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2039 return false;
2040 if (spellInfo)
2041 {
2042 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2043 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2044 return false;
2045
2046 // bleeding effects are not reduced by armor
2047 if (effIndex != MAX_SPELL_EFFECTS)
2048 {
2049 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2050 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2051 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2052 return false;
2053 }
2054 }
2055 return true;
2056}
@ MECHANIC_BLEED
Definition SharedDefines.h:1351
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition SpellInfo.h:191

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline

References Corpse, Dead, and m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1708{ return (m_deathState == DeathState::JustDied); };

References JustDied, and m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10316{
10317 return GetReactionTo(unit) >= REP_FRIENDLY;
10318}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:315

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition UnitDefines.h:333

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10321{
10322 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10323 if (!my_faction || !my_faction->faction)
10324 return false;
10325
10326 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10327 if (raw_faction && raw_faction->reputationListID >= 0)
10328 return false;
10329
10330 return my_faction->IsHostileToPlayers();
10331}
int32 reputationListID
Definition DBCStructure.h:909
uint32 faction
Definition DBCStructure.h:941
bool IsHostileToPlayers() const
Definition DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12894{
12895 SpellInfo const* spellInfo = spell->GetSpellInfo();
12896 if (!spellInfo)
12897 {
12898 return false;
12899 }
12900
12902 {
12903 return false;
12904 }
12905
12907 {
12908 return false;
12909 }
12910
12911 uint32 schoolMask = spell->GetSpellSchoolMask();
12912 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12913 {
12914 return false;
12915 }
12916
12917 // If m_immuneToDamage type contain magic, IMMUNE damage.
12918 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12919 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12920 {
12921 if ((itr->type & schoolMask) == schoolMask)
12922 {
12923 return true;
12924 }
12925 }
12926
12927 return false;
12928}
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition SharedDefines.h:493
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition SharedDefines.h:446
@ IMMUNITY_DAMAGE
Definition SharedDefines.h:1408
@ SPELL_SCHOOL_MASK_NONE
Definition SharedDefines.h:307
std::vector< SpellImmune > SpellImmuneList
Definition SpellDefines.h:182

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12862{
12863 if (!spellInfo)
12864 {
12865 return false;
12866 }
12867
12868 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12869 {
12870 return false;
12871 }
12872
12873 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12874 {
12875 return false;
12876 }
12877
12878 uint32 schoolMask = spellInfo->GetSchoolMask();
12879 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12880 {
12881 return false;
12882 }
12883
12884 // If m_immuneToDamage type contain magic, IMMUNE damage.
12885 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12886 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12887 if ((itr->type & schoolMask) == schoolMask)
12888 return true;
12889
12890 return false;
12891}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12846{
12847 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12848 {
12849 return false;
12850 }
12851
12852 // If m_immuneToDamage type contain magic, IMMUNE damage.
12853 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12854 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12855 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12856 return true;
12857
12858 return false;
12859}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
13010{
13011 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
13012}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12930
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12845

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12970{
12971 SpellInfo const* spellInfo = spell->GetSpellInfo();
12973 {
12974 return false;
12975 }
12976
12977 uint32 schoolMask = spell->GetSpellSchoolMask();
12978 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12979 {
12980 return false;
12981 }
12982
12983 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12984 {
12985 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12986 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12987 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12988 {
12989 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12990 {
12991 return true;
12992 }
12993 }
12994 }
12995
12996 return false;
12997}
@ IMMUNITY_SCHOOL
Definition SharedDefines.h:1407
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition SpellInfo.cpp:1323

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12947{
12948 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12949 return false;
12950
12951 uint32 schoolMask = spellInfo->GetSchoolMask();
12952 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12953 {
12954 return false;
12955 }
12956
12957 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12958 {
12959 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12960 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12961 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12962 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12963 return true;
12964 }
12965
12966 return false;
12967}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12931{
12932 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12933 {
12934 return false;
12935 }
12936
12937 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12938 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12939 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12940 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12941 return true;
12942
12943 return false;
12944}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), IsImmunedToDamageOrSchool(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

13015{
13016 if (!spellInfo)
13017 return false;
13018
13019 // Single spell immunity.
13020 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
13021 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
13022 if (itr->type == spellInfo->Id)
13023 return true;
13024
13025 // xinef: my special immunity, if spellid is not on this list it means npc is immune
13026 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
13027 if (!allowIdList.empty())
13028 {
13029 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
13030 if (itr->type == spellInfo->Id)
13031 return false;
13032 return true;
13033 }
13034
13035 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13036 return false;
13037
13038 if (spellInfo->Dispel)
13039 {
13040 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
13041 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
13042 if (itr->type == spellInfo->Dispel)
13043 return true;
13044 }
13045
13046 // Spells that don't have effectMechanics.
13047 if (spellInfo->Mechanic)
13048 {
13049 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13050 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13051 if (itr->type == spellInfo->Mechanic)
13052 return true;
13053 }
13054
13055 bool immuneToAllEffects = true;
13056 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13057 {
13058 // State/effect immunities applied by aura expect full spell immunity
13059 // Ignore effects with mechanic, they are supposed to be checked separately
13060 if (!spellInfo->Effects[i].IsEffect())
13061 continue;
13062
13063 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
13064 if (IsImmunedToSpellEffect(spellInfo, i))
13065 {
13066 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
13067 return true;
13068 continue;
13069 }
13070
13071 immuneToAllEffects = false;
13072 break;
13073 }
13074 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
13075 return true;
13076
13077 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13078 {
13079 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
13080 if (spell)
13081 {
13082 spellSchoolMask = spell->GetSpellSchoolMask();
13083 }
13084
13085 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
13086 {
13087 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13088 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13089 {
13090 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
13091 if (((itr->type & spellSchoolMask) == spellSchoolMask)
13092 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
13093 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
13094 {
13095 return true;
13096 }
13097 }
13098 }
13099 }
13100
13101 return false;
13102}
@ IMMUNITY_ALLOW_ID
Definition SharedDefines.h:1412
@ IMMUNITY_ID
Definition SharedDefines.h:1411
@ IMMUNITY_MECHANIC
Definition SharedDefines.h:1410

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13105{
13106 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13107 return false;
13108
13109 // xinef: pet scaling auras
13110 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13111 return false;
13112
13113 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13114 return false;
13115
13116 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13117 uint32 effect = spellInfo->Effects[index].Effect;
13118 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13119 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13120 {
13121 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13122 {
13123 return true;
13124 }
13125 }
13126
13127 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13128 {
13129 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13130 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13131 if (itr->type == mechanic)
13132 return true;
13133 }
13134
13135 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13136 {
13138 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13139 {
13140 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13141 {
13142 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13143 {
13144 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13145 {
13146 return true;
13147 }
13148 }
13149 }
13150 }
13151
13152 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13153 {
13154 // Check for immune to application of harmful magical effects
13156 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13157 {
13158 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13159 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13160 !spellInfo->IsPositiveEffect(index) && // Harmful
13161 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13162 {
13163 return true;
13164 }
13165 }
13166 }
13167 }
13168
13169 return false;
13170}
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition SharedDefines.h:816
@ SPELL_ATTR3_ALWAYS_HIT
Definition SharedDefines.h:522
@ IMMUNITY_STATE
Definition SharedDefines.h:1406
@ IMMUNITY_EFFECT
Definition SharedDefines.h:1405
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition SharedDefines.h:566
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition SpellDefines.h:159
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition Unit.cpp:21096

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
870{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4263{
4264 if (c->GetMapId() == MAP_THE_RING_OF_VALOR)
4265 {
4266 // skip transport check, check for being below floor level
4267 if (this->GetPositionZ() < 28.0f)
4268 return false;
4269 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4270 if (Battleground* bg = bgMap->GetBG())
4271 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4272 return false;
4273 }
4274 else if (c->GetMapId() == MAP_ICECROWN_CITADEL)
4275 {
4276 // if static transport doesn't match - return false
4277 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4278 return false;
4279
4280 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4281 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4282 {
4283 if (c->GetTransport() != this->GetTransport())
4284 return false;
4285 if (this->GetTransport())
4286 {
4287 if (c->GetPositionY() < 2033.0f)
4288 {
4289 if (this->GetPositionY() > 2033.0f)
4290 return false;
4291 }
4292 else if (c->GetPositionY() < 2438.0f)
4293 {
4294 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4295 return false;
4296 }
4297 else if (this->GetPositionY() < 2438.0f)
4298 return false;
4299 }
4300 }
4301 }
4302 else
4303 {
4304 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4305 if (c->GetTransport() != this->GetTransport())
4306 return false;
4307 }
4308
4309 LiquidStatus liquidStatus = GetLiquidData().Status;
4310 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4311
4312 // In water or jumping in water
4313 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4314 {
4315 return c->CanEnterWater();
4316 }
4317 else
4318 {
4319 return c->CanWalk() || c->CanFly();
4320 }
4321}
@ MAP_THE_RING_OF_VALOR
Definition AreaDefines.h:261
@ MAP_ICECROWN_CITADEL
Definition AreaDefines.h:265
LiquidStatus
Definition GridTerrainData.h:190
@ LIQUID_MAP_ABOVE_WATER
Definition GridTerrainData.h:192
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition GridTerrainData.h:32
Definition Map.h:661
BattlegroundMap * ToBattlegroundMap()
Definition Map.h:377
bool IsFalling() const
Definition Unit.cpp:19786
LiquidData const & GetLiquidData() const
Definition Object.cpp:3071
LiquidStatus Status
Definition GridTerrainData.h:206

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_ICECROWN_CITADEL, MAP_LIQUID_STATUS_IN_CONTACT, MAP_THE_RING_OF_VALOR, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), ResetToHomeOrientation::Execute(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), spell_chapter5_return_to_capital::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), Creature::IsUpdateNeeded(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_muru::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_alar::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_kiljaeden::Reset(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
20903{
20904 // Check target exists
20905 if (!who)
20906 return false;
20907 // Search in threat list
20908 ObjectGuid guid = who->GetGUID();
20909 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
20910 {
20911 HostileReference* ref = (*i);
20912 // Return true if the unit matches
20913 if (ref && ref->getUnitGuid() == guid)
20914 return true;
20915 }
20916 // Nothing found, false.
20917 return false;
20918}
Definition ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition ThreatMgr.h:273

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21132{
21133 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21134 {
21135 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21136 {
21137 return false;
21138 }
21139 }
21140
21141 if (ShapeshiftForm form = GetShapeshiftForm())
21142 {
21143 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21144 if (!shapeshift)
21145 {
21146 return true;
21147 }
21148
21149 if (!(shapeshift->flags1 & SHAPESHIFT_FLAG_STANCE))
21150 {
21151 return true;
21152 }
21153 }
21154
21156 {
21157 return false;
21158 }
21159
21160 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21161 if (!display)
21162 {
21163 return true;
21164 }
21165
21167 if (!displayExtra)
21168 {
21169 return true;
21170 }
21171
21172 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21173 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21174
21175 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21176 {
21177 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21178 {
21179 return true;
21180 }
21181 }
21182
21183 return false;
21184}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition DBCStructure.h:771
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition SharedDefines.h:417
@ SHAPESHIFT_FLAG_STANCE
Definition UnitDefines.h:104
uint32 getTransForm() const
Definition Unit.h:1881
bool HasFlag(ChrRacesFlags flag) const
Definition DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition DBCStructure.h:725
uint32 DisplayRaceID
Definition DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition DBCStructure.h:804
uint32 flags1
Definition DBCStructure.h:1823

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SHAPESHIFT_FLAG_STANCE, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4253{
4254 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4255}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition UnitDefines.h:331

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18876{
18877 if (this == unit)
18878 return true;
18879
18880 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18881 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18882 if (u1 == u2)
18883 return true;
18884
18885 if (u1->IsPlayer() && u2->IsPlayer())
18886 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18887 // Xinef: we assume that npcs with the same faction are in party
18888 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18889 return u1->GetFaction() == u2->GetFaction();
18890 // Xinef: creature type_flag should work for party check only if player group is not a raid
18893 return true;
18894 else
18895 return false;
18896}
bool isRaidGroup() const
Definition Group.cpp:2281
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2322

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18899{
18900 if (this == unit)
18901 return true;
18902
18903 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18904 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18905 if (u1 == u2)
18906 return true;
18907
18908 if (u1->IsPlayer() && u2->IsPlayer())
18909 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18910 // Xinef: we assume that npcs with the same faction are in party
18911 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18912 return u1->GetFaction() == u2->GetFaction();
18915 return true;
18916 else
18917 return false;
18918}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4229{
4230 // can always move when not casting
4232 {
4233 return false;
4234 }
4235
4236 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4238 {
4239 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4240 {
4241 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4242 {
4243 return false;
4244 }
4245 }
4246 }
4247
4248 // prohibit movement for all other spell casts
4249 return true;
4250}
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10334{
10335 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10336 if (!my_faction || !my_faction->faction)
10337 return true;
10338
10339 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10340 if (raw_faction && raw_faction->reputationListID >= 0)
10341 return false;
10342
10343 return my_faction->IsNeutralToAll();
10344}
bool IsNeutralToAll() const
Definition DBCStructure.h:982

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4160{
4161 // We don't do loop here to explicitly show that melee spell is excluded.
4162 // Maybe later some special spells will be excluded too.
4163
4164 // generic spells are cast when they are not finished and not delayed
4167 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4168 {
4169 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4170 {
4171 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4172 return true;
4173 }
4174 }
4175 // channeled spells may be delayed, but they are still considered cast
4176 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4178 {
4179 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4180 return true;
4181 }
4182 // autorepeat spells may be finished or delayed, but they are still considered cast
4183 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4184 return true;
4185
4186 return false;
4187}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition SharedDefines.h:484

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), Player::CanExecutePendingSpellCastRequest(), CombatStop(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
747{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition UnitDefines.h:160

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17424{
17425 Unit* owner = GetOwner();
17426
17427 if (!owner || !owner->IsPlayer())
17428 return false;
17429
17430 // if the owner has that pet aura, return true
17431 for (PetAura const* petAura : owner->m_petAuras)
17432 if (petAura->GetAura(GetEntry()) == aura->GetId())
17433 return true;
17434
17435 return false;
17436}
Definition SpellMgr.h:470
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:236

References Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16829{
16830 uint32 transformId = getTransForm();
16831 if (!transformId)
16832 return false;
16833
16834 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16835 if (!spellInfo)
16836 return false;
16837
16838 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16839}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition SpellInfo.cpp:2149

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1241 {
1242 if (Unit* u = GetCharm())
1243 return u->isPossessed();
1244 else
1245 return false;
1246 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1247{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition Unit.h:1238

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:316

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5902{
5904 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5905 {
5906 if ((*i)->GetMiscValue() == script)
5907 if ((*i)->IsAffectedOnSpell(spell))
5908 return (*i);
5909 }
5910 return nullptr;
5911}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16799{
16800 uint8 s = getStandState();
16801 return
16805}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), WorldSession::HandleMovementOpcodes(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3130{
3131 // These spells can't be blocked
3132 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3133 return false;
3134
3135 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3136 {
3137 // Check creatures flags_extra for disable block
3138 if (victim->IsCreature() &&
3140 return false;
3141
3142 float blockChance = victim->GetUnitBlockChance();
3143 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3144
3145 // xinef: cant block while casting or while stunned
3146 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3147 blockChance = 0.0f;
3148
3149 if (roll_chance_f(blockChance))
3150 return true;
3151 }
3152 return false;
3153}
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition CreatureData.h:49
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition SharedDefines.h:414
@ UNIT_STATE_CONTROLLED
Definition UnitDefines.h:211
bool HasIgnoreHitDirectionAura() const
Definition Unit.h:1726
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3819
float GetUnitBlockChance() const
Definition Unit.cpp:3731

References CREATURE_FLAG_EXTRA_NO_BLOCK, GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:156

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17511{
17512 SpellInfo const* spellProto = aura->GetSpellInfo();
17513 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17514
17515 // let the aura be handled by new proc system if it has new entry
17516 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17517 return false;
17518
17519 // Get proc Event Entry
17520 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17521
17522 // Get EventProcFlag
17523 uint32 EventProcFlag;
17524 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17525 EventProcFlag = spellProcEvent->procFlags;
17526 else
17527 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17528 // Continue if no trigger exist
17529 if (!EventProcFlag)
17530 return false;
17531
17532 // Additional checks for triggered spells (ignore trap casts)
17533 if (eventInfo.GetHitMask() & PROC_EX_INTERNAL_TRIGGERED && !(EventProcFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17534 {
17536 return false;
17537 }
17538
17539 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17540 // Xinef: skip victim auras
17541 // Excluded player shoot spells
17542 // Excluded player item spells
17543 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17544 {
17545 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17546 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17547 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17548 {
17549 return false;
17550 }
17551 }
17552
17553 // Check spellProcEvent data requirements
17554 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17555 return false;
17556 // In most cases req get honor or XP from kill
17557 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17558 {
17559 bool allow = false;
17560
17561 if (victim)
17562 allow = ToPlayer()->isHonorOrXPTarget(victim);
17563
17564 // Shadow Word: Death - can trigger from every kill
17565 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17566 allow = true;
17567 if (!allow)
17568 return false;
17569 }
17570 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17571 // But except periodic and kill triggers (can triggered from self)
17572 if (procSpell && procSpell->Id == spellProto->Id
17573 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17574 return false;
17575
17576 // Check if current equipment allows aura to proc
17577 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17578 {
17579 Player* player = ToPlayer();
17580 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17581 {
17582 Item* item = nullptr;
17583 if (attType == BASE_ATTACK)
17585 else if (attType == OFF_ATTACK)
17587 else
17589
17590 if (player->IsInFeralForm())
17591 return false;
17592
17593 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17594 return false;
17595 }
17596 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17597 {
17598 // Check if player is wearing shield
17600 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17601 return false;
17602 }
17603 }
17604 // Get chance from spell
17605 float chance = float(spellProto->ProcChance);
17606 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17607 if (spellProcEvent && spellProcEvent->customChance)
17608 chance = spellProcEvent->customChance;
17609 // If PPM exist calculate chance from PPM
17610 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17611 {
17612 uint32 attackSpeed = 0;
17613 Unit* attacker = nullptr;
17614 if (!isVictim)
17615 attacker = this;
17616 else if (victim)
17617 attacker = victim;
17618
17619 if (attacker)
17620 {
17621 if (!procSpell || procSpell->DmgClass == SPELL_DAMAGE_CLASS_MELEE || procSpell->IsRangedWeaponSpell())
17622 {
17623 attackSpeed = attacker->GetAttackTime(attType);
17624 }
17625 else //spells user their casttime for ppm calculations
17626 {
17627 if (procSpell->CastTimeEntry)
17628 attackSpeed = procSpell->CastTimeEntry->CastTime;
17629
17630 //instants and fast spells use 1.5s castspeed
17631 if (attackSpeed < 1500)
17632 attackSpeed = 1500;
17633 }
17634 }
17635 chance = GetPPMProcChance(attackSpeed, spellProcEvent->ppmRate, spellProto);
17636 }
17637
17638 // Custom chances
17639 switch (spellProto->SpellFamilyName)
17640 {
17642 {
17643 // Recklessness, allow to proc only once for whirlwind
17644 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17645 return false;
17646 }
17647 }
17648
17649 if (eventInfo.GetProcChance())
17650 {
17651 chance = *eventInfo.GetProcChance();
17652 }
17653
17654 // Apply chance modifer aura
17655 if (Player* modOwner = GetSpellModOwner())
17656 {
17657 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17658 }
17659
17660 return roll_chance_f(chance);
17661}
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:688
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition SharedDefines.h:505
@ SPELL_ATTR3_CAN_PROC_FROM_PROCS
Definition SharedDefines.h:530
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ PROC_EX_INTERNAL_TRIGGERED
Definition SpellMgr.h:221
@ PROC_FLAG_DEATH
Definition SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition SpellMgr.h:135
@ PROC_FLAG_KILL
Definition SpellMgr.h:108
@ PROC_FLAG_DONE_TRAP_ACTIVATION
Definition SpellMgr.h:138
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1255
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12696
uint32 GetCategory() const
Definition SpellInfo.cpp:871
int32 EquippedItemClass
Definition SpellInfo.h:375
uint32 ProcFlags
Definition SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition SpellInfo.h:376
SpellCastTimesEntry const * CastTimeEntry
Definition SpellInfo.h:347
uint32 DmgClass
Definition SpellInfo.h:389
bool IsRangedWeaponSpell() const
Definition SpellInfo.cpp:1276
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13549
uint32 Class
Definition ItemTemplate.h:621
int32 CastTime
Definition DBCStructure.h:1761

References BASE_ATTACK, SpellCastTimesEntry::CastTime, SpellInfo::CastTimeEntry, ItemTemplate::Class, SpellProcEventEntry::customChance, SpellInfo::DmgClass, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), ProcEventInfo::GetHitMask(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_EX_INTERNAL_TRIGGERED, PROC_FLAG_DEATH, PROC_FLAG_DONE_TRAP_ACTIVATION, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_CAN_PROC_FROM_PROCS, SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELL_DAMAGE_CLASS_MELEE, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4414{
4416}
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
14100{
14101 return _IsValidAssistTarget(target, nullptr);
14102}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition Unit.cpp:14105

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13977{
13978 return _IsValidAttackTarget(target, bySpell);
13979}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

References m_unitTypeMask, and UNIT_MASK_VEHICLE.

Referenced by Battleground::AddCreature(), Creature::AddToWorld(), ApplyResilience(), CanHaveThreatList(), spell_wintergrasp_water::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), MotionTransport::DelayedTeleportTransport(), Spell::EffectDummy(), Spell::EffectKnockBack(), Spell::EffectSummonType(), CreatureAI::EnterEvadeMode(), SmartScript::GetTargets(), GetVelocity(), AuraEffect::HandleAuraControlVehicle(), debug_commandscript::HandleDebugEnterVehicleCommand(), debug_commandscript::HandleDebugSetVehicleIdCommand(), spell_q13280_13283_plant_battle_standard::HandleDummy(), BattlefieldWG::HandleKill(), BattlegroundIC::HandleKillUnit(), WorldSession::HandlePetActionHelper(), spell_q12919_gymers_throw::HandleScript(), spell_putricide_mutated_transformation::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat_aura::Load(), MagicSpellHitResult(), npc_brann_radio::npc_brann_radioAI::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), SmartScript::ProcessAction(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), Map::SummonCreature(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1284
T_VALUES GetValue(FLAG_TYPE flag) const
Definition Object.h:394

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinBoundaryRadius()

bool Unit::IsWithinBoundaryRadius ( const Unit obj) const
706{
707 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
708 return false;
709
710 float objBoundaryRadius = std::max(obj->GetBoundaryRadius(), MIN_MELEE_REACH);
711
712 return IsInDist(obj, objBoundaryRadius);
713}
float GetBoundaryRadius() const
Definition Unit.h:821
bool IsInDist(float x, float y, float z, float dist) const
Definition Position.h:221

References GetBoundaryRadius(), WorldObject::InSamePhase(), Position::IsInDist(), WorldObject::IsInMap(), and MIN_MELEE_REACH.

Referenced by Spell::CheckRange(), Acore::WorldObjectSpellConeTargetCheck::operator()(), and Player::Update().

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
667{
668 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
669 return false;
670
671 float dx = GetPositionX() - obj->GetPositionX();
672 float dy = GetPositionY() - obj->GetPositionY();
673 float dz = GetPositionZ() - obj->GetPositionZ();
674 float distsq = dx * dx + dy * dy + dz * dz;
675
676 float maxdist = dist + GetMeleeRange(obj);
677
678 if ((IsPlayer() || obj->IsPlayer()) && HasLeewayMovement() && obj->HasLeewayMovement())
679 maxdist += LEEWAY_BONUS_RANGE;
680
681 return distsq < maxdist * maxdist;
682}
#define LEEWAY_BONUS_RANGE
Definition ObjectDefines.h:51
bool HasLeewayMovement() const
Definition Unit.h:1642

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasLeewayMovement(), WorldObject::InSamePhase(), WorldObject::IsInMap(), Object::IsPlayer(), and LEEWAY_BONUS_RANGE.

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), ChaseMovementGenerator< T >::DoUpdate(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessEvent(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
691{
692 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
693 {
694 return false;
695 }
696
697 auto dx = GetPositionX() - obj->GetPositionX();
698 auto dy = GetPositionY() - obj->GetPositionY();
699 auto dz = GetPositionZ() - obj->GetPositionZ();
700 auto distsq = dx * dx + dy * dy + dz * dz;
701
702 return distsq <= dist * dist;
703}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim(), npc_sunblade_scout::JustEngagedWith(), and npc_amanishi_scout::JustEngagedWith().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19359{
19360 float angle = forward ? 0 : M_PI;
19361 if (IsCreature())
19362 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19363 else
19364 {
19365 float vcos = cos(angle + GetOrientation());
19366 float vsin = std::sin(angle + GetOrientation());
19367
19368 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19369 data << GetPackGUID();
19370 data << uint32(0); // Sequence
19371 data << float(vcos); // x direction
19372 data << float(vsin); // y direction
19373 data << float(speedXY); // Horizontal speed
19374 data << float(-speedZ); // Z Movement speed (vertical)
19375
19376 ToPlayer()->GetSession()->SendPacket(&data);
19377 }
19378}
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition MotionMaster.cpp:587
WorldSession * GetSession() const
Definition Player.h:2005
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:251
@ SMSG_MOVE_KNOCK_BACK
Definition Opcodes.h:269

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::IsCreature(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19381{
19382 float x, y, z;
19383 obj->GetContactPoint(this, x, y, z);
19384 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19385 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19386}
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition MotionMaster.h:229
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition Object.cpp:2735

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17804{
17805 // Prevent killing unit twice (and giving reward from kill twice)
17806 if (!victim->GetHealth())
17807 return;
17808
17809 if (killer && !killer->IsInMap(victim))
17810 killer = nullptr;
17811
17812 // find player: owner of controlled `this` or `this` itself maybe
17813 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17814 Creature* creature = victim->ToCreature();
17815
17816 bool isRewardAllowed = true;
17817 if (creature)
17818 {
17819 isRewardAllowed = (creature->IsDamageEnoughForLootingAndReward() && !creature->IsLootRewardDisabled());
17820 if (!isRewardAllowed)
17821 creature->SetLootRecipient(nullptr);
17822 }
17823
17824 // pussywizard: remade this if section (player is on the same map
17825 if (isRewardAllowed && creature)
17826 {
17827 Player* lr = creature->GetLootRecipient();
17828 if (lr && lr->IsInMap(creature))
17829 player = creature->GetLootRecipient();
17830 else if (Group* lrg = creature->GetLootRecipientGroup())
17831 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17832 if (Player* member = itr->GetSource())
17833 if (member->IsAtLootRewardDistance(creature))
17834 {
17835 player = member;
17836 break;
17837 }
17838 }
17839
17840 // Exploit fix
17841 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17842 isRewardAllowed = false;
17843
17844 // Reward player, his pets, and group/raid members
17845 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17846 if (isRewardAllowed && player && player != victim)
17847 {
17848 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17849 data << player->GetGUID(); // player with killing blow
17850 data << victim->GetGUID(); // victim
17851
17852 Player* looter = player;
17853 Group* group = player->GetGroup();
17854 bool hasLooterGuid = false;
17855
17856 if (group)
17857 {
17858 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17859
17860 if (creature)
17861 {
17862 group->UpdateLooterGuid(creature, true);
17863 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17864 {
17865 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17866 if (looter)
17867 {
17868 hasLooterGuid = true;
17869 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17870 }
17871 }
17872 }
17873 }
17874 else
17875 {
17876 player->SendDirectMessage(&data);
17877
17878 if (creature)
17879 {
17880 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17881 data2 << creature->GetGUID();
17882 data2 << uint8(0); // unk1
17883 data2 << uint8(0); // no group looter
17884 player->SendMessageToSet(&data2, true);
17885 }
17886 }
17887
17888 // Generate loot before updating looter
17889 if (creature)
17890 {
17891 Loot* loot = &creature->loot;
17892 loot->clear();
17893
17894 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17895 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17896
17897 if (creature->GetLootMode())
17899
17900 if (group)
17901 {
17902 if (hasLooterGuid)
17903 group->SendLooter(creature, looter);
17904 else
17905 group->SendLooter(creature, nullptr);
17906
17907 // Update round robin looter only if the creature had loot
17908 if (!creature->loot.empty())
17909 group->UpdateLooterGuid(creature);
17910 }
17911 }
17912
17913 player->RewardPlayerAndGroupAtKill(victim, false);
17914 }
17915
17916 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
17917 if (killer && (killer->IsPet() || killer->IsTotem()))
17918 if (Unit* owner = killer->GetOwner())
17919 {
17920 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17921 sScriptMgr->OnPlayerCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17922 }
17923
17924 if (killer != victim)
17925 {
17926 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17927 }
17928
17929 // Proc auras on death - must be before aura/combat remove
17930 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17931
17932 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17933 // and before Spirit of Redemption as it also removes auras
17934 if (killer)
17935 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17936 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17937
17938 // Spirit of Redemption
17939 // if talent known but not triggered (check priest class for speedup check)
17940 bool spiritOfRedemption = false;
17942 {
17943 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17944 {
17945 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17946 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
17947 {
17948 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17949 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17950 victim->GetPositionY(), victim->GetPositionZ());
17951
17952 ACE_Stack_Trace trace(0, 50);
17953 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17954 }
17955 else
17956 {
17957 // save value before aura remove
17958 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17959 if (!ressSpellId)
17960 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17961
17962 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17963 victim->RemoveAllAurasOnDeath();
17964
17965 // Stop attacks
17966 victim->CombatStop();
17968
17969 // restore for use at real death
17970 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17971
17972 // FORM_SPIRITOFREDEMPTION and related auras
17973 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17974 spiritOfRedemption = true;
17975 }
17976 }
17977 }
17978
17979 if (!spiritOfRedemption)
17980 {
17981 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17983 }
17984
17985 // Inform pets (if any) when player kills target)
17986 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17987 // selection will get stuck on same target and break pet react state
17988 if (player)
17989 {
17990 Pet* pet = player->GetPet();
17991 if (pet && pet->IsAlive() && pet->isControlled())
17992 pet->AI()->KilledUnit(victim);
17993 }
17994
17995 // 10% durability loss on death
17996 // clean InHateListOf
17997 if (Player* plrVictim = victim->ToPlayer())
17998 {
17999 // remember victim PvP death for corpse type and corpse reclaim delay
18000 // at original death (not at SpiritOfRedemtionTalent timeout)
18001 plrVictim->SetPvPDeath(player != nullptr);
18002
18003 // only if not player and not controlled by player pet. And not at BG
18004 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
18005 {
18006 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
18007 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
18008 // durability lost message
18009 plrVictim->SendDurabilityLoss();
18010 }
18011 // Call KilledUnit for creatures
18012 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18013 killer->ToCreature()->AI()->KilledUnit(victim);
18014
18015 // last damage from non duel opponent or opponent controlled creature
18016 if (plrVictim->duel)
18017 {
18018 plrVictim->duel->Opponent->CombatStopWithPets(true);
18019 plrVictim->CombatStopWithPets(true);
18020 plrVictim->DuelComplete(DUEL_INTERRUPTED);
18021 }
18022 }
18023 else // creature died
18024 {
18025 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
18026
18027 if (!creature->IsPet() && creature->GetLootMode() > 0)
18028 {
18029 creature->GetThreatMgr().ClearAllThreat();
18030
18031 // must be after setDeathState which resets dynamic flags
18032 if (!creature->loot.isLooted())
18033 {
18035 }
18036 else
18037 {
18038 creature->AllLootRemovedFromCorpse();
18039 }
18040 }
18041
18042 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
18043 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18044 killer->ToCreature()->AI()->KilledUnit(victim);
18045
18046 // Call creature just died function
18047 if (CreatureAI* ai = creature->AI())
18048 {
18049 ai->JustDied(killer);
18050 }
18051
18052 if (TempSummon* summon = creature->ToTempSummon())
18053 {
18054 if (WorldObject* summoner = summon->GetSummoner())
18055 {
18056 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
18057 {
18058 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
18059 }
18060 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
18061 {
18062 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
18063 }
18064 }
18065 }
18066
18067 // Dungeon specific stuff, only applies to players killing creatures
18068 if (creature->GetInstanceId())
18069 {
18070 Map* instanceMap = creature->GetMap();
18071 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18073
18074 if (instanceMap->IsDungeon() && player)
18075 if (instanceMap->IsRaidOrHeroicDungeon())
18077 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18078 }
18079 }
18080
18081 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18082 // handle player kill only if not suicide (spirit of redemption for example)
18083 if (player && killer != victim)
18084 {
18085 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18086 pvp->HandleKill(player, victim);
18087
18088 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18089 bf->HandleKill(player, victim);
18090 }
18091
18092 //if (victim->IsPlayer())
18093 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18094 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18095
18096 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18097 if (player)
18098 if (Battleground* bg = player->GetBattleground())
18099 {
18100 if (victim->IsPlayer())
18101 bg->HandleKillPlayer(victim->ToPlayer(), player);
18102 else
18103 bg->HandleKillUnit(victim->ToCreature(), player);
18104 }
18105
18106 // achievement stuff
18107 if (killer && victim->IsPlayer())
18108 {
18109 if (killer->IsCreature())
18111 else if (victim != killer && killer->IsPlayer())
18113 }
18114
18115 // Hook for OnPVPKill Event
18116 if (killer)
18117 {
18118 if (Player* killerPlr = killer->ToPlayer())
18119 {
18120 if (Player* killedPlr = victim->ToPlayer())
18121 sScriptMgr->OnPlayerPVPKill(killerPlr, killedPlr);
18122 else if (Creature* killedCre = victim->ToCreature())
18123 sScriptMgr->OnPlayerCreatureKill(killerPlr, killedCre);
18124 }
18125 else if (Creature* killerCre = killer->ToCreature())
18126 {
18127 if (Player* killed = victim->ToPlayer())
18128 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18129 }
18130 }
18131
18132 sScriptMgr->OnUnitDeath(victim, killer);
18133}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:45
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition DBCEnums.h:170
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:483
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3371
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3878
@ PROC_FLAG_KILLED
Definition SpellMgr.h:107
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition WorldConfig.h:472
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition WorldConfig.h:25
Definition Battlefield.h:204
Definition CreatureAI.h:71
virtual void KilledUnit(Unit *)
Definition CreatureAI.h:132
Loot loot
Definition Creature.h:230
uint16 GetLootMode() const
Definition Creature.h:244
void AllLootRemovedFromCorpse()
Definition Creature.cpp:3001
bool IsLootRewardDisabled() const
Definition Creature.h:366
Player * GetLootRecipient() const
Definition Creature.cpp:1317
bool IsDamageEnoughForLootingAndReward() const
Definition Creature.cpp:3824
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1324
GroupReference * next()
Definition GroupReference.h:36
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1757
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2394
ObjectGuid GetLooterGuid() const
Definition Group.cpp:2331
LootMethod GetLootMethod() const
Definition Group.cpp:2326
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1868
void SendLooter(Creature *creature, Player *pLooter)
Definition Group.cpp:967
void PermBindAllPlayers()
Definition Map.cpp:2202
Definition Map.h:160
bool IsRaidOrHeroicDungeon() const
Definition Map.h:295
InstanceMap * ToInstanceMap()
Definition Map.h:374
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:124
Definition OutdoorPvP.h:186
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5728
TeamId GetTeamId(bool original=false) const
Definition Player.h:2115
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12223
uint32 GetResurrectionSpellId()
Definition Player.cpp:12639
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12540
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12753
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5418
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5619
uint32 GetInstanceId() const
Definition Object.h:510
uint32 GetZoneId() const
Definition Object.cpp:3038
@ SMSG_PARTYKILLLOG
Definition Opcodes.h:531
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
uint32 mingold
Definition CreatureData.h:231
uint32 maxgold
Definition CreatureData.h:232
uint32 lootid
Definition CreatureData.h:224
Definition LootMgr.h:313
bool empty() const
Definition LootMgr.h:367
bool isLooted() const
Definition LootMgr.h:368
void clear()
Definition LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition LootMgr.cpp:838
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:571

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Creature::HasFlagsExtra(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), Creature::IsLootRewardDisabled(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), JustDied, CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1161{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), spell_chapter2_persuasive_strike::HandleHit(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_singularity::Reset(), boss_archimonde::Reset(), npc_necropolis_health::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_necrotic_shard::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19245{
19246 Player* player = ToPlayer();
19247 if (!player)
19248 {
19249 if (Unit* charmer = GetCharmer())
19250 {
19251 player = charmer->ToPlayer();
19252 if (player && player->m_mover != this)
19253 player = nullptr;
19254 }
19255 }
19256
19257 if (!player)
19258 {
19259 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19260 }
19261 else
19262 {
19263 float vcos, vsin;
19264 GetSinCos(x, y, vsin, vcos);
19265
19266 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19267 data << GetPackGUID();
19268 data << uint32(0); // counter
19269 data << float(vcos); // x direction
19270 data << float(vsin); // y direction
19271 data << float(speedXY); // Horizontal speed
19272 data << float(-speedZ); // Z Movement speed (vertical)
19273
19274 player->GetSession()->SendPacket(&data);
19275
19276 if (player->HasIncreaseMountedFlightSpeedAura() || player->HasFlyAura())
19277 player->SetCanFly(true, true);
19278
19279 player->SetCanKnockback(true);
19280 }
19281}
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition MotionMaster.cpp:558
SafeUnitPointer m_mover
Definition Player.h:2344
void SetCanKnockback(bool value)
Definition Player.h:2510
bool SetCanFly(bool apply, bool packetOnly=false) override
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition Player.cpp:15945
bool HasFlyAura() const
Definition Unit.h:1717
bool HasIncreaseMountedFlightSpeedAura() const
Definition Unit.h:1744
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition Position.cpp:92

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasFlyAura(), HasIncreaseMountedFlightSpeedAura(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3357{
3358 // Can`t miss on dead target (on skinning for example)
3359 if (!victim->IsAlive() && !victim->IsPlayer())
3360 return SPELL_MISS_NONE;
3361
3362 // vehicles cant miss
3363 if (IsVehicle())
3364 return SPELL_MISS_NONE;
3365
3366 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3367 // resist and deflect chances
3368 // xinef: skip all calculations, proof: Toxic Tolerance quest
3369 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3370 return SPELL_MISS_NONE;
3371
3372 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3373 {
3374 return SPELL_MISS_NONE;
3375 }
3376
3377 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3378 int32 thisLevel = getLevelForTarget(victim);
3379 if (IsCreature() && ToCreature()->IsTrigger())
3380 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3381 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3382
3383 int32 MISS_CHANCE_MULTIPLIER;
3384 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3385 {
3386 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3387 }
3388 else
3389 {
3390 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3391 victim->IsPlayer()
3394 }
3395
3396 // Base hit chance from attacker and victim levels
3397 int32 modHitChance = levelDiff < 3
3398 ? 96 - levelDiff
3399 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3400
3401 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3402 if (Player* modOwner = GetSpellModOwner())
3403 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3404
3405 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3407
3408 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3409 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3410 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3411 {
3412 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3414 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3415 if (spellInfo->IsAffectingArea())
3416 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3417
3418 // Decrease hit chance from victim rating bonus
3419 if (victim->IsPlayer())
3420 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3421 }
3422
3423 int32 HitChance = modHitChance * 100;
3424 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3425 // Xinef: Totems should inherit casters ratings?
3426 if (IsTotem())
3427 {
3428 if (Unit* owner = GetOwner())
3429 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3430 }
3431 else
3432 HitChance += int32(m_modSpellHitChance * 100.0f);
3433
3434 if (HitChance < 100)
3435 HitChance = 100;
3436 else if (HitChance > 10000)
3437 HitChance = 10000;
3438
3439 int32 tmp = 10000 - HitChance;
3440
3441 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3442
3443 if (rand < tmp)
3444 return SPELL_MISS_MISS;
3445
3446 // Chance resist mechanic (select max value from every mechanic spell effect)
3447 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3448 tmp += resist_chance;
3449
3450 // Chance resist debuff
3451 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3452 {
3453 bool bNegativeAura = true;
3454 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3455 {
3456 // Xinef: Check if effect exists!
3457 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3458 {
3459 bNegativeAura = false;
3460 break;
3461 }
3462 }
3463
3464 if (bNegativeAura)
3465 {
3466 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3467 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3468 }
3469
3470 // Players resistance for binary spells
3471 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3472 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3473 }
3474
3475 // Roll chance
3476 if (rand < tmp)
3477 return SPELL_MISS_RESIST;
3478
3479 // cast by caster in front of victim
3480 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3481 {
3482 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3483 tmp += deflect_chance;
3484 if (rand < tmp)
3485 return SPELL_MISS_DEFLECT;
3486 }
3487
3488 return SPELL_MISS_NONE;
3489}
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition SharedDefines.h:677
@ SPELL_MISS_NONE
Definition SharedDefines.h:1530
@ SPELL_MISS_RESIST
Definition SharedDefines.h:1532
@ SPELL_MISS_MISS
Definition SharedDefines.h:1531
@ SPELL_MISS_DEFLECT
Definition SharedDefines.h:1539
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition SpellAuraDefines.h:241
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition SpellDefines.h:92
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:231
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition WorldConfig.h:131
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition WorldConfig.h:480
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition WorldConfig.h:479
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5234
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6152
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6138
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition Unit.cpp:3162

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13173{
13174 if (!victim || pdamage == 0)
13175 return 0;
13176
13177 if (IsCreature())
13178 {
13179 // Dancing Rune Weapon...
13180 if (GetEntry() == 27893)
13181 {
13182 if (Unit* owner = GetOwner())
13183 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13184 }
13185 }
13186
13187 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13188
13189 // Done fixed damage bonus auras
13190 int32 DoneFlatBenefit = 0;
13191
13192 // ..done
13194 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13195 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13196 DoneFlatBenefit += (*i)->GetAmount();
13197
13198 // ..done
13199 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13200
13201 // ..done (base at attack power for marked target and base at attack power for creature type)
13202 int32 APbonus = 0;
13203
13204 if (attType == RANGED_ATTACK)
13205 {
13206 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13207
13208 // ..done (base at attack power and creature type)
13210 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13211 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13212 APbonus += (*i)->GetAmount();
13213 }
13214 else
13215 {
13216 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13217
13218 // ..done (base at attack power and creature type)
13220 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13221 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13222 APbonus += (*i)->GetAmount();
13223 }
13224
13225 if (APbonus != 0) // Can be negative
13226 {
13227 bool normalized = false;
13228 if (spellProto)
13229 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13230 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13231 {
13232 normalized = true;
13233 break;
13234 }
13235 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13236 }
13237
13238 // Done total percent damage auras
13239 float DoneTotalMod = 1.0f;
13240
13241 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13242 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13243 {
13244 // Some spells don't benefit from pct done mods
13246 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13247 {
13248 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13249 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13250 {
13251 if (((*i)->GetMiscValue() & damageSchoolMask))
13252 {
13253 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13254 AddPct(DoneTotalMod, (*i)->GetAmount());
13255 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13256 AddPct(DoneTotalMod, (*i)->GetAmount());
13257 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13258 AddPct(DoneTotalMod, (*i)->GetAmount());
13259 }
13260 }
13261 }
13262 }
13263
13265 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13266 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13267 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13268 AddPct(DoneTotalMod, (*i)->GetAmount());
13269
13270 // bonus against aurastate
13272 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13273 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13274 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13275 AddPct(DoneTotalMod, (*i)->GetAmount());
13276
13277 // done scripted mod (take it from owner)
13278 Unit* owner = GetOwner() ? GetOwner() : this;
13279 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13280 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13281 {
13282 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13283 continue;
13284
13285 if (!(*i)->IsAffectedOnSpell(spellProto))
13286 continue;
13287
13288 switch ((*i)->GetMiscValue())
13289 {
13290 // Tundra Stalker
13291 // Merciless Combat
13292 case 7277:
13293 {
13294 // Merciless Combat
13295 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13296 {
13297 if (!victim->HealthAbovePct(35))
13298 AddPct(DoneTotalMod, (*i)->GetAmount());
13299 }
13300 // Tundra Stalker
13301 else
13302 {
13303 // Frost Fever (target debuff)
13304 if (victim->HasAura(55095))
13305 AddPct(DoneTotalMod, (*i)->GetAmount());
13306 }
13307 break;
13308 }
13309 // Rage of Rivendare
13310 case 7293:
13311 {
13312 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13313 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13314 break;
13315 }
13316 // Marked for Death
13317 case 7598:
13318 case 7599:
13319 case 7600:
13320 case 7601:
13321 case 7602:
13322 {
13323 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13324 AddPct(DoneTotalMod, (*i)->GetAmount());
13325 break;
13326 }
13327 // Dirty Deeds
13328 case 6427:
13329 case 6428:
13330 {
13331 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13332 {
13333 // effect 0 has expected value but in negative state
13334 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13335 AddPct(DoneTotalMod, bonus);
13336 }
13337 break;
13338 }
13339 }
13340 }
13341
13342 // Custom scripted damage
13343 if (spellProto)
13344 switch (spellProto->SpellFamilyName)
13345 {
13347 // Glacier Rot
13348 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13350 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13351 AddPct(DoneTotalMod, aurEff->GetAmount());
13352 break;
13353 }
13354
13355 // Some spells don't benefit from done mods
13356 if (spellProto)
13357 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13358 {
13359 DoneFlatBenefit = 0;
13360 DoneTotalMod = 1.0f;
13361 }
13362
13363 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13364
13365 // apply spellmod to Done damage
13366 if (spellProto)
13367 if (Player* modOwner = GetSpellModOwner())
13368 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13369
13370 // bonus result can be negative
13371 return uint32(std::max(tmpDamage, 0.0f));
13372}
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition SharedDefines.h:910
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition SharedDefines.h:594
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition SharedDefines.h:533
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition SpellDefines.h:76
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17305
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition Unit.h:1360

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13375{
13376 if (pdamage == 0)
13377 return 0;
13378
13379 int32 TakenFlatBenefit = 0;
13380
13381 // ..taken
13383 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13384 if ((*i)->GetMiscValue() & damageSchoolMask)
13385 TakenFlatBenefit += (*i)->GetAmount();
13386
13387 if (attType != RANGED_ATTACK)
13389 else
13391
13392 // Taken total percent damage auras
13393 float TakenTotalMod = 1.0f;
13394
13396
13397 // .. taken pct (special attacks)
13398 if (spellProto)
13399 {
13400 // From caster spells
13402 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13403 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13404 AddPct(TakenTotalMod, (*i)->GetAmount());
13405
13406 // Mod damage from spell mechanic
13407 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13408
13409 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13410 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13411 mechanicMask |= (1 << MECHANIC_BLEED);
13412
13413 if (mechanicMask)
13414 {
13416 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13417 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13418 AddPct(TakenTotalMod, (*i)->GetAmount());
13419 }
13420 }
13421
13422 TakenTotalMod = processDummyAuras(TakenTotalMod);
13423
13424 // .. taken pct: class scripts
13425 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13426 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13427 {
13428 switch ((*i)->GetMiscValue())
13429 {
13430 }
13431 }*/
13432
13433 if (attType != RANGED_ATTACK)
13434 {
13436 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13437 AddPct(TakenTotalMod, (*i)->GetAmount());
13438 }
13439 else
13440 {
13441 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13442 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13443 AddPct(TakenTotalMod, (*i)->GetAmount());
13444 }
13445
13446 // No positive taken bonus, custom attr
13447 if (spellProto)
13448 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13449 {
13450 TakenFlatBenefit = 0;
13451 TakenTotalMod = 1.0f;
13452 }
13453
13454 // xinef: sanctified wrath talent
13455 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13456 {
13457 float ignoreModifier = 1.0f - TakenTotalMod;
13458 bool addModifier = false;
13460 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13461 if ((*j)->GetMiscValue() & damageSchoolMask)
13462 {
13463 ApplyPct(ignoreModifier, (*j)->GetAmount());
13464 addModifier = true;
13465 }
13466
13467 if (addModifier)
13468 TakenTotalMod += ignoreModifier;
13469 }
13470
13471 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13472
13473 // bonus result can be negative
13474 return uint32(std::max(tmpDamage, 0.0f));
13475}
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:177
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition SpellInfo.h:197
float processDummyAuras(float TakenTotalMod) const
Definition Unit.cpp:11998
bool HasIgnoreTargetResistAura() const
Definition Unit.h:1742

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3184{
3185 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3186 // resist and deflect chances
3187 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3188 return SPELL_MISS_NONE;
3189
3190 WeaponAttackType attType = BASE_ATTACK;
3191
3192 // Check damage class instead of attack type to correctly handle judgements
3193 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3194 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3195 attType = RANGED_ATTACK;
3196
3197 int32 attackerWeaponSkill;
3198 // skill value for these spells (for example judgements) is 5* level
3199 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3200 attackerWeaponSkill = GetLevel() * 5;
3201 // bonus from skills is 0.04% per skill Diff
3202 else
3203 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3204
3205 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3206
3207 uint32 roll = urand (0, 10000);
3208
3209 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3210 // Roll miss
3211 uint32 tmp = missChance;
3212 if (roll < tmp)
3213 return SPELL_MISS_MISS;
3214
3215 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3216 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3217 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3218
3219 // Same spells cannot be parry/dodge
3220 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3221 return SPELL_MISS_NONE;
3222
3223 // Chance resist mechanic
3224 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3225 tmp += resist_chance;
3226 if (roll < tmp)
3227 return SPELL_MISS_RESIST;
3228
3229 // Ranged attacks can only miss, resist and deflect
3230 if (attType == RANGED_ATTACK)
3231 {
3232 // only if in front
3233 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3234 {
3235 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3236 tmp += deflect_chance;
3237 if (roll < tmp)
3238 return SPELL_MISS_DEFLECT;
3239 }
3240
3241 canDodge = false;
3242 canParry = false;
3243 }
3244
3245 // Check for attack from behind
3246 // xinef: if from behind or spell requires cast from behind
3247 if (!victim->HasInArc(M_PI, this))
3248 {
3249 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3250 {
3251 // Can`t dodge from behind in PvP (but its possible in PvE)
3252 if (victim->IsPlayer())
3253 {
3254 canDodge = false;
3255 }
3256
3257 // Can`t parry or block
3258 canParry = false;
3259 canBlock = false;
3260 }
3261 }
3262
3263 // Check creatures flags_extra for disable parry
3264 if (victim->IsCreature())
3265 {
3266 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3267 // Xinef: no dodge flag
3268 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3269 canDodge = false;
3270 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3271 canParry = false;
3272 // Check creatures flags_extra for disable block
3273 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3274 canBlock = false;
3275 }
3276 // Ignore combat result aura
3278 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3279 {
3280 if (!(*i)->IsAffectedOnSpell(spellInfo))
3281 continue;
3282 switch ((*i)->GetMiscValue())
3283 {
3284 case MELEE_HIT_DODGE:
3285 canDodge = false;
3286 break;
3287 case MELEE_HIT_BLOCK:
3288 canBlock = false;
3289 break;
3290 case MELEE_HIT_PARRY:
3291 canParry = false;
3292 break;
3293 default:
3294 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3295 break;
3296 }
3297 }
3298
3299 if (canDodge)
3300 {
3301 // Roll dodge
3302 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3303 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3305 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3306 // Reduce dodge chance by attacker expertise rating
3307 if (IsPlayer())
3308 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3309 else
3311
3312 // xinef: cant dodge while casting or while stunned
3313 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3314 dodgeChance = 0;
3315
3316 tmp += dodgeChance;
3317 if (roll < tmp)
3318 return SPELL_MISS_DODGE;
3319 }
3320
3321 if (canParry)
3322 {
3323 // Roll parry
3324 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3325 // Reduce parry chance by attacker expertise rating
3326 if (IsPlayer())
3327 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3328 else
3330
3331 // xinef: cant parry while casting or while stunned
3332 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3333 parryChance = 0;
3334
3335 tmp += parryChance;
3336 if (roll < tmp)
3337 return SPELL_MISS_PARRY;
3338 }
3339
3340 if (canBlock)
3341 {
3342 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3343
3344 // xinef: cant block while casting or while stunned
3345 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3346 blockChance = 0;
3347
3348 tmp += blockChance;
3349 if (roll < tmp)
3350 return SPELL_MISS_BLOCK;
3351 }
3352
3353 return SPELL_MISS_NONE;
3354}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition CreatureData.h:68
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition SharedDefines.h:676
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition SharedDefines.h:675
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition SharedDefines.h:507
@ SPELL_MISS_PARRY
Definition SharedDefines.h:1534
@ SPELL_MISS_DODGE
Definition SharedDefines.h:1533
@ SPELL_MISS_BLOCK
Definition SharedDefines.h:1535
@ SPELL_AURA_MOD_EXPERTISE
Definition SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition SpellAuraDefines.h:311
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition SpellInfo.h:193
float GetUnitDodgeChance() const
Definition Unit.cpp:3669
float GetTotalAuraMultiplier(AuraType auratype) const
Definition Unit.cpp:6024
float GetUnitParryChance() const
Definition Unit.cpp:3686
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition Unit.cpp:19089
uint32 flags_extra
Definition CreatureData.h:246

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19090{
19091 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19092 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19093 {
19094 return 0.0f;
19095 }
19096
19097 //calculate miss chance
19098 float missChance = victim->GetUnitMissChance(attType);
19099
19100 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19101 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19102 {
19103 missChance += 19;
19104 }
19105
19106 // bonus from skills is 0.04%
19107 //miss_chance -= skillDiff * 0.04f;
19108 int32 diff = -skillDiff;
19109 if (victim->IsPlayer())
19110 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19111 else
19112 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19113
19114 // Calculate hit chance
19115 float hitChance = 100.0f;
19116
19117 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19118 if (spellId)
19119 {
19120 if (Player* modOwner = GetSpellModOwner())
19121 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19122 }
19123
19124 missChance -= hitChance - 100.0f;
19125
19126 if (attType == RANGED_ATTACK)
19127 missChance -= m_modRangedHitChance;
19128 else
19129 missChance -= m_modMeleeHitChance;
19130
19131 // Limit miss chance from 0 to 60%
19132 if (missChance < 0.0f)
19133 return 0.0f;
19134 if (missChance > 60.0f)
19135 return 60.0f;
19136 return missChance;
19137}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10597{
10598 if (apply)
10599 {
10600 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10601 {
10602 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10603 Unit::AuraMap& tAuras = GetOwnedAuras();
10604 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10605 {
10606 if ((*itr).second->IsRemoved())
10607 continue;
10608
10609 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10610 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10611 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10612 }
10613 }
10614 }
10615 else
10616 {
10617 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10618 {
10619 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10620
10621 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10622 {
10623 Unit::AuraMap& tAuras = GetOwnedAuras();
10624 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10625 {
10626 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10627 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10628 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10629 }
10630 }
10631 }
10632 }
10633}
@ AURA_STATE_ENRAGE
Definition SharedDefines.h:1320
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:834
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:849
std::multimap< uint32, Aura * > AuraMap
Definition Unit.h:625
AuraMap & GetOwnedAuras()
Definition Unit.h:1296

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14197{
14198 int32 gain = 0;
14199
14200 if (dVal == 0)
14201 return 0;
14202
14203 int32 curHealth = (int32)GetHealth();
14204
14205 int32 val = dVal + curHealth;
14206 if (val <= 0)
14207 {
14208 SetHealth(0);
14209 return -curHealth;
14210 }
14211
14212 int32 maxHealth = (int32)GetMaxHealth();
14213
14214 if (val < maxHealth)
14215 {
14216 SetHealth(val);
14217 gain = val - curHealth;
14218 }
14219 else if (curHealth != maxHealth)
14220 {
14221 SetHealth(maxHealth);
14222 gain = maxHealth - curHealth;
14223 }
14224
14225 return gain;
14226}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14255{
14256 if (dVal == 0)
14257 return 0;
14258
14259 int32 gain = 0;
14260
14261 int32 curPower = (int32)GetPower(power);
14262
14263 int32 val = dVal + curPower;
14264 if (val <= 0)
14265 {
14266 SetPower(power, 0, withPowerUpdate);
14267 return -curPower;
14268 }
14269
14270 int32 maxPower = (int32)GetMaxPower(power);
14271
14272 if (val < maxPower)
14273 {
14274 SetPower(power, val, withPowerUpdate);
14275 gain = val - curPower;
14276 }
14277 else if (curPower != maxPower)
14278 {
14279 SetPower(power, maxPower, withPowerUpdate);
14280 gain = maxPower - curPower;
14281 }
14282
14283 if (GetAI())
14284 {
14285 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14286 }
14287
14288 return gain;
14289}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition UnitAI.h:374
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15671

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14293{
14294 float amount = (float)GetMaxPower(power);
14295 ApplyPercentModFloatVar(amount, pct, apply);
14296
14297 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14298}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition ThreatMgr.h:307

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
15079{
15080 if (!spellInfo || castTime < 0)
15081 return;
15082
15083 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
15084 return;
15085
15086 // called from caster
15087 if (Player* modOwner = GetSpellModOwner())
15089 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
15090
15091 switch (spellInfo->DmgClass)
15092 {
15094 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
15095 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15096 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
15097 castTime = 500;
15098 break;
15100 break; // no known cases
15102 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15103 break;
15105 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15106 break;
15107 default:
15108 break;
15109 }
15110}
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition SharedDefines.h:591
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
bool CanInstantCast() const
Definition Unit.h:1506

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14979{
14980 // don't mod permanent auras duration
14981 if (duration < 0)
14982 return duration;
14983
14984 // some auras are not affected by duration modifiers
14985 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14986 return duration;
14987
14988 // cut duration only of negative effects
14989 // xinef: also calculate self casts, spell can be reflected for example
14990 if (!positive)
14991 {
14992 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14993
14994 int32 durationMod;
14995 int32 durationMod_always = 0;
14996 int32 durationMod_not_stack = 0;
14997
14998 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14999 {
15000 if (!(mechanic & 1 << i))
15001 continue;
15002
15003 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
15004 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
15005 continue;
15006
15007 // Find total mod value (negative bonus)
15008 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
15009 // Find max mod (negative bonus)
15010 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
15011 // Check if mods applied before were weaker
15012 if (new_durationMod_always < durationMod_always)
15013 durationMod_always = new_durationMod_always;
15014 if (new_durationMod_not_stack < durationMod_not_stack)
15015 durationMod_not_stack = new_durationMod_not_stack;
15016 }
15017
15018 // Select strongest negative mod
15019 if (durationMod_always > durationMod_not_stack)
15020 durationMod = durationMod_not_stack;
15021 else
15022 durationMod = durationMod_always;
15023
15024 if (durationMod != 0)
15025 AddPct(duration, durationMod);
15026
15027 // there are only negative mods currently
15028 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
15029 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
15030
15031 durationMod = 0;
15032 if (durationMod_always > durationMod_not_stack)
15033 durationMod += durationMod_not_stack;
15034 else
15035 durationMod += durationMod_always;
15036
15037 if (durationMod != 0)
15038 AddPct(duration, durationMod);
15039 }
15040 else
15041 {
15042 // else positive mods here, there are no currently
15043 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
15044 }
15045
15046 // Glyphs which increase duration of selfcasted buffs
15047 if (target == this)
15048 {
15049 switch (spellProto->SpellFamilyName)
15050 {
15051 case SPELLFAMILY_DRUID:
15052 if (spellProto->SpellFamilyFlags[0] & 0x100)
15053 {
15054 // Glyph of Thorns
15055 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
15056 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15057 }
15058 break;
15060 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
15061 {
15062 // Glyph of Blessing of Might
15063 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
15064 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15065 }
15066 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
15067 {
15068 // Glyph of Blessing of Wisdom
15069 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
15070 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15071 }
15072 break;
15073 }
15074 }
15075 return std::max(duration, 0);
15076}
constexpr auto MINUTE
Definition Common.h:47
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition SharedDefines.h:653
@ MECHANIC_ENRAGED
Definition SharedDefines.h:1367
@ MECHANIC_DISORIENTED
Definition SharedDefines.h:1338
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition SpellAuraDefines.h:295

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13564{
13565 if (mount)
13567
13569
13570 if (Player* player = ToPlayer())
13571 {
13572 sScriptMgr->AnticheatSetUnderACKmount(player);
13573
13574 // mount as a vehicle
13575 if (VehicleId)
13576 {
13577 if (CreateVehicleKit(VehicleId, creatureEntry))
13578 {
13579 GetVehicleKit()->Reset();
13580
13581 // Send others that we now have a vehicle
13583 data << GetPackGUID();
13584 data << uint32(VehicleId);
13585 SendMessageToSet(&data, true);
13586
13588 player->GetSession()->SendPacket(&data);
13589
13590 // mounts can also have accessories
13592 }
13593 }
13594
13595 // unsummon pet
13596 Pet* pet = player->GetPet();
13597 if (pet)
13598 {
13600 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13601 if (bg && bg->isArena())
13603 else
13604 player->UnsummonPetTemporaryIfAny();
13605 }
13606
13607 // xinef: if we have charmed npc, stun him also
13608 if (Unit* charm = player->GetCharm())
13609 if (charm->IsCreature())
13610 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13611
13612 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13613 data << GetPackGUID();
13614 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13615 data << player->GetCollisionHeight();
13616 player->GetSession()->SendPacket(&data);
13617 }
13618
13620}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition SpellDefines.h:60
bool isArena() const
Definition Battleground.h:404
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition Unit.cpp:18816
void Reset(bool evading=false)
Definition Vehicle.cpp:120
void InstallAllAccessories(bool evading)
Definition Vehicle.cpp:87

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), and WorldSession::SendDoFlight().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19819{
19820 DisableSpline();
19821 if (IsPlayer())
19822 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19823 else
19824 {
19825 Position pos = {x, y, z, orientation};
19826 SendTeleportPacket(pos);
19827 UpdatePosition(x, y, z, orientation, true);
19830 }
19831}
@ TELE_TO_WITH_PET
Definition Player.h:823
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:822
@ TELE_TO_SPELL
Definition Player.h:821
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:819
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:820
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:818
void ReinitializeMovement()
Definition MotionMaster.cpp:904
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1345
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:19840
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19231
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:19859

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19814{
19815 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19816}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:19813

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_chesspiece::Reset(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20069{
20070 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20071 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20072 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20074 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20075 if (IsInWorld())
20076 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20077
20078 LOG_INFO("entities.unit", "Summon Slot: ");
20079 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20080 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20081 LOG_INFO("server.loading", " ");
20082
20083 LOG_INFO("entities.unit", "Controlled List: ");
20084 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20085 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20086 LOG_INFO("server.loading", " ");
20087
20088 LOG_INFO("entities.unit", "Aura List: ");
20089 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20090 LOG_INFO("entities.unit", "{}, ", itr->first);
20091 LOG_INFO("server.loading", " ");
20092
20093 if (IsVehicle())
20094 {
20095 LOG_INFO("entities.unit", "Passenger List: ");
20096 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20097 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20098 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20099 LOG_INFO("server.loading", " ");
20100 }
20101
20102 if (GetVehicle())
20103 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20104}
Seats
Definition boss_flame_leviathan.cpp:168
SeatMap Seats
Definition Vehicle.h:56

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, Vehicle::Seats, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20711{
20712 Creature const* creature = ToCreature();
20713
20714 // UNIT_NPC_FLAGS
20715 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20716 {
20717 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20718
20719 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20720 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20721
20722 if (!target->CanSeeSpellClickOn(creature))
20723 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20724
20725 if (!target->CanSeeVendor(creature))
20726 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20727
20728 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20729 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20730
20731 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20732 }
20733
20734 // UNIT_FIELD_AURASTATE
20735 if (posPointers.UnitFieldAuraStatePos >= 0)
20736 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20737
20738 // UNIT_FIELD_FLAGS
20739 if (posPointers.UnitFieldFlagsPos >= 0)
20740 {
20741 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20742 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20743 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20744
20745 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20746 }
20747
20748 // UNIT_FIELD_DISPLAYID
20749 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20750 if (posPointers.UnitFieldDisplayPos >= 0)
20751 {
20753 if (creature)
20754 {
20755 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20756
20757 // this also applies for transform auras
20758 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20759 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20760 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20761 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20762 {
20763 cinfo = transformInfo;
20764 break;
20765 }
20766
20768 {
20769 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20770 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20771 else
20772 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20773 }
20774 }
20775
20776 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20777 }
20778
20779 // UNIT_DYNAMIC_FLAGS
20780 // Hide lootable animation for unallowed players.
20781 if (posPointers.UnitDynamicFlagsPos >= 0)
20782 {
20784
20785 if (creature)
20786 {
20787 if (creature->hasLootRecipient())
20788 {
20789 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20790 if (creature->isTappedBy(target))
20791 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20792 }
20793
20794 if (!target->isAllowedToLoot(creature))
20795 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20796 }
20797
20798 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20799 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20801 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20802
20803 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20804 }
20805
20806 // UNIT_FIELD_BYTES_2
20807 if (posPointers.UnitFieldBytes2Pos >= 0)
20808 {
20809 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20810 {
20812 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20813 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20814 // Allow targetting opposite faction in party when enabled in config
20815 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
20816 }// pussywizard / Callmephil
20817 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20818 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20819 {
20820 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20821 }
20822 }
20823
20824 // UNIT_FIELD_FACTIONTEMPLATE
20825 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20826 {
20827 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20828 {
20830 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20831 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20832 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
20833 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20834 }// pussywizard / Callmephil
20835 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20836 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20837 {
20838 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20839 }
20840 else if (target->IsGMSpectator() && IsControlledByPlayer())
20841 {
20842 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20843 }
20844 }
20845
20846 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
20847}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:52
@ UNIT_DYNFLAG_TRACK_UNIT
Definition SharedDefines.h:3372
@ CONFIG_INSTANT_TAXI
Definition WorldConfig.h:339
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition Creature.cpp:1276
bool isTappedBy(Player const *player) const
Definition Creature.cpp:1392
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5620
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14328
bool IsGMSpectator() const
Definition Player.h:1170
bool IsSpectator() const
Definition Player.h:2585
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14305
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition Unit.cpp:10635
bool IsGMAccount() const
Definition WorldSession.cpp:205
int32 UnitFieldFlagsPos
Definition UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition UnitUtils.h:97
uint32 CreatureDisplayID
Definition CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition Creature.cpp:162
CreatureModel const * GetFirstVisibleModel() const
Definition Creature.cpp:172

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), CreatureTemplate::HasFlagsExtra(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), Player::IsGMSpectator(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16757{
16758 if (slot >= MAX_MOTION_SLOT)
16759 return;
16760
16761 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16762 movementGenerator->Pause(timer);
16763
16764 StopMoving();
16765}
@ MAX_MOTION_SLOT
Definition MotionMaster.h:66
Definition MovementGenerator.h:28
void StopMoving()
Definition Unit.cpp:16737

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), boss_shade_of_aran::SetGUID(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20197{
20198 CharmInfo* charmInfo = GetCharmInfo();
20199 if (!charmInfo || !IsCreature())
20200 return;
20201
20202 if ((sDisableMgr->IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target)
20203 {
20204 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20205 if (Unit* owner = GetOwner())
20206 {
20207 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20208 {
20209 AttackStop();
20210 charmInfo->SetIsAtStay(false);
20211 charmInfo->SetIsCommandAttack(true);
20212 charmInfo->SetIsReturning(false);
20213 charmInfo->SetIsFollowing(false);
20214
20215 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20216 }
20217 else if (owner->IsValidAttackTarget(target))
20218 {
20219 AttackStop();
20220 charmInfo->SetIsAtStay(false);
20221 charmInfo->SetIsCommandAttack(true);
20222 charmInfo->SetIsReturning(false);
20223 charmInfo->SetIsFollowing(false);
20224
20225 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20226 ToCreature()->AI()->AttackStart(target);
20227 else
20228 GetMotionMaster()->MoveChase(target);
20229 }
20230 }
20231
20232 // can be extended in future
20233 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20234 {
20235 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20236 charmInfo->SetForcedTargetGUID(target->GetGUID());
20237 }
20238 else
20239 {
20240 charmInfo->SetForcedSpell(0);
20242 }
20243 }
20244}
#define sDisableMgr
Definition DisableMgr.h:88
#define PET_FOLLOW_DIST
Definition PetDefines.h:205
@ SPELL_FAILED_OUT_OF_RANGE
Definition SharedDefines.h:1057
@ SPELL_FAILED_LINE_OF_SIGHT
Definition SharedDefines.h:1007
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:313
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:409
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition CharmInfo.h:177
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition CharmInfo.h:179
void SetIsCommandAttack(bool val)
Definition CharmInfo.cpp:303

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, sDisableMgr, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6479{
6480 // Not much to do if no flags are set.
6481 if (procAttacker && actor)
6482 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6483 // Now go on with a victim's events'n'auras
6484 // Not much to do if no flags are set or there is no victim
6485 if (victim && victim->IsAlive() && procVictim)
6486 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6487}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16146{
16147 // Player is loaded now - do not allow passive spell casts to proc
16148 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16149 return;
16150 // For melee/ranged based attack need update skills and set some Aura states if victim present
16151 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16152 {
16153 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16154 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16155 return;
16156
16157 // Update skills here for players
16158 // only when you are not fighting other players or their pets/totems (pvp)
16159 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16160 {
16161 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16163 {
16164 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16165 }
16166 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16167 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16168 {
16169 ToPlayer()->UpdateCombatSkills(target, attType, true);
16170 }
16171 }
16172 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16174 {
16175 // for victim
16176 if (isVictim)
16177 {
16178 // if victim and dodge attack
16179 if (procExtra & PROC_EX_DODGE)
16180 {
16181 // Update AURA_STATE on dodge
16182 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16183 {
16186 }
16187 }
16188 // if victim and parry attack
16189 if (procExtra & PROC_EX_PARRY)
16190 {
16191 // For Hunters only Counterattack (skip Mongoose bite)
16193 {
16196 }
16197 else
16198 {
16201 }
16202 }
16203 // if and victim block attack
16204 if (procExtra & PROC_EX_BLOCK)
16205 {
16208 }
16209 }
16210 else // For attacker
16211 {
16212 // Overpower on victim dodge
16213 if (procExtra & PROC_EX_DODGE)
16214 {
16216 {
16217 AddComboPoints(target, 1);
16219 }
16220 }
16221
16222 // Wolverine Bite
16223 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16224 {
16225 AddComboPoints(target, 1);
16227 }
16228 }
16229 }
16230 }
16231
16232 Unit* actor = isVictim ? target : this;
16233 Unit* actionTarget = !isVictim ? target : this;
16234
16235 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16236
16237 ProcTriggeredList procTriggered;
16238 // Fill procTriggered list
16239 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16240 {
16241 // Do not allow auras to proc from effect triggered by itself
16242 if (procAura && procAura->Id == itr->first)
16243 continue;
16244
16245 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16246 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16247 continue;
16248
16249 ProcTriggeredData triggerData(itr->second->GetBase());
16250 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16251 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16252 if (isVictim)
16253 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16254
16255 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16256
16257 // only auras that have trigger spell should proc from fully absorbed damage
16258 if (procExtra & PROC_EX_ABSORB && isVictim)
16259 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16260 active = true;
16261
16262 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16263 // only player spells are taken into account
16264 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16265 active = true;
16266
16267 // AuraScript Hook
16268 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16269 {
16270 continue;
16271 }
16272
16273 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16274
16275 // AuraScript Hook
16276 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16277 {
16278 continue;
16279 }
16280
16281 // do checks using conditions table
16282 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16283 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16284 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16285 {
16286 continue;
16287 }
16288
16289 bool hasTriggeredProc = false;
16290 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16291 {
16292 if (itr->second->HasEffect(i))
16293 {
16294 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16295
16296 // Skip this auras
16297 if (isNonTriggerAura[aurEff->GetAuraType()])
16298 continue;
16299
16300 // If not trigger by default and spellProcEvent == nullptr - skip
16301 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16302 continue;
16303
16304 switch (aurEff->GetAuraType())
16305 {
16308 case SPELL_AURA_DUMMY:
16310 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16311 {
16312 triggerData.triggerSpelId[i] = triggerSpellId;
16313 hasTriggeredProc = true;
16314 }
16315 break;
16316 default:
16317 break;
16318 }
16319
16320 // Some spells must always trigger
16321 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16322 triggerData.effMask |= 1 << i;
16323 }
16324 }
16325
16326 if (triggerData.effMask)
16327 {
16328 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16329 if (hasTriggeredProc)
16330 {
16331 bool proccessed = false;
16332 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16333 {
16334 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16335 {
16336 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16337 if (iter != procTriggered.end())
16338 {
16339 std::advance(iter, 1);
16340 procTriggered.insert(iter, triggerData);
16341 proccessed = true;
16342 break;
16343 }
16344 }
16345 }
16346
16347 if (!proccessed)
16348 {
16349 procTriggered.push_front(triggerData);
16350 }
16351 }
16352 else
16353 {
16354 procTriggered.push_front(triggerData);
16355 }
16356 }
16357 }
16358
16359 // Nothing found
16360 if (procTriggered.empty())
16361 return;
16362
16363 // Note: must SetCantProc(false) before return
16365 SetCantProc(true);
16366
16367 // Handle effects proceed this time
16368 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16369 {
16370 // look for aura in auras list, it may be removed while proc event processing
16371 if (i->aura->IsRemoved())
16372 continue;
16373
16374 bool useCharges = i->aura->IsUsingCharges();
16375 // no more charges to use, prevent proc
16376 if (useCharges && !i->aura->GetCharges())
16377 continue;
16378
16379 bool takeCharges = false;
16380 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16381
16382 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16383
16384 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16385
16386 // For players set spell cooldown if need
16387 uint32 cooldown = 0;
16388 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16389 cooldown = i->spellProcEvent->cooldown;
16390
16391 // Xinef: set cooldown for actual proc
16392 eventInfo.SetProcCooldown(cooldown);
16393
16394 // Note: must SetCantProc(false) before return
16396 SetCantProc(true);
16397
16398 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16399
16400 // "handled" is needed as long as proc can be handled in multiple places
16401 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16402 {
16403 uint32 Id = i->aura->GetId();
16404 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16405 takeCharges = true;
16406 }
16407
16408 if (!handled)
16409 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16410 {
16411 if (!(i->effMask & (1 << effIndex)))
16412 continue;
16413
16414 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16415 ASSERT(triggeredByAura);
16416
16417 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16418 if (prevented)
16419 {
16420 takeCharges = true;
16421 continue;
16422 }
16423
16424 switch (triggeredByAura->GetAuraType())
16425 {
16427 {
16428 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16429 // Don`t drop charge or add cooldown for not started trigger
16430 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16431 takeCharges = true;
16432 break;
16433 }
16435 {
16436 // target has to be valid
16437 if (!eventInfo.GetProcTarget())
16438 break;
16439
16440 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16441 takeCharges = true;
16442 break;
16443 }
16445 case SPELL_AURA_DUMMY:
16446 {
16447 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16448 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16449 takeCharges = true;
16450 break;
16451 }
16456 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16457 takeCharges = true;
16458 break;
16460 {
16461 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16462 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16463 takeCharges = true;
16464 break;
16465 }
16467 {
16468 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16469 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16470 if (damage > 0)
16471 {
16473 takeCharges = true;
16474 }
16475 break;
16476 }
16478 {
16479 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16480 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16481 HandleAuraRaidProcFromCharge(triggeredByAura);
16482 takeCharges = true;
16483 break;
16484 }
16486 {
16487 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16488
16489 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16490 takeCharges = true;
16491 break;
16492 }
16494 // Skip melee hits or instant cast spells
16495 // xinef: check channeled spells which are affected by haste also
16496 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16497 (procSpellInfo->CalcCastTime() > 0 /*||
16498 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16499 takeCharges = true;
16500 break;
16502 // Skip Melee hits and spells ws wrong school
16503 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16504 takeCharges = true;
16505 break;
16507 // Skip Melee hits and targets with magnet aura
16508 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16509 takeCharges = true;
16510 break;
16513 // Skip melee hits and spells ws wrong school or zero cost
16514 if (procSpellInfo &&
16515 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16516 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16517 takeCharges = true;
16518 break;
16521 // Compare mechanic
16522 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16523 takeCharges = true;
16524 break;
16526 // Compare casters
16527 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16528 takeCharges = true;
16529 break;
16530 // CC Auras which use their amount amount to drop
16531 // Are there any more auras which need this?
16537 {
16538 // Spell own direct damage at apply wont break the CC
16539 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16540 if (procSpellInfo)
16541 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16542 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16543 break;
16544
16545 // chargeable mods are breaking on hit
16546 if (useCharges)
16547 takeCharges = true;
16548 else if (triggeredByAura->GetAmount()) // aura must have amount
16549 {
16550 int32 damageLeft = triggeredByAura->GetAmount();
16551 // No damage left
16552 if (damageLeft < int32(damage))
16553 i->aura->Remove();
16554 else
16555 triggeredByAura->SetAmount(damageLeft - damage);
16556 }
16557 break;
16558 }
16560 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16561 break;
16562 takeCharges = true;
16563 break;
16566 {
16567 if (triggeredByAura->GetSpellModifier())
16568 {
16569 // Do proc if mod is consumed by spell
16570 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16571 {
16572 takeCharges = true;
16573 }
16574 }
16575 break;
16576 }
16577 default:
16578 takeCharges = true;
16579 break;
16580 }
16581 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16582 }
16583 // Remove charge (aura can be removed by triggers)
16584 // xinef: take into account attribute6 of proc spell
16585 if (prepare && useCharges && takeCharges)
16586 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16587 i->aura->DropCharge();
16588
16589 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16590
16592 SetCantProc(false);
16593 }
16594
16595 // Cleanup proc requirements
16597 SetCantProc(false);
16598}
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition ConditionMgr.h:148
@ EFFECT_2
Definition SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition SharedDefines.h:523
#define EFFECT_ALL
Definition SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition SharedDefines.h:620
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition SpellMgr.h:218
@ PROC_FLAG_DONE_PERIODIC
Definition SpellMgr.h:134
static bool isNonTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:106
static bool isTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:104
std::list< ProcTriggeredData > ProcTriggeredList
Definition Unit.cpp:15945
@ REACTIVE_OVERPOWER
Definition Unit.h:597
@ REACTIVE_DEFENSE
Definition Unit.h:595
@ REACTIVE_HUNTER_PARRY
Definition Unit.h:596
@ REACTIVE_WOLVERINE_BITE
Definition Unit.h:598
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition SpellAuraEffects.cpp:7270
SpellModifier * GetSpellModifier() const
Definition SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition SpellAuras.h:108
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1025
Definition Unit.h:421
void SetProcCooldown(uint32 cooldown)
Definition Unit.h:455
Unit * GetActionTarget() const
Definition Unit.h:441
Unit * GetProcTarget() const
Definition Unit.h:442
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition Unit.cpp:9010
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition Unit.cpp:17663
bool IsHunterPet() const
Definition Unit.h:748
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition Unit.cpp:17510
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition Unit.cpp:8815
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition Unit.h:1263
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition Unit.cpp:6689
void StartReactiveTimer(ReactiveType reactive)
Definition Unit.h:1768
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition Unit.cpp:9935
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition Unit.cpp:17752
Definition Unit.cpp:15926

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11999{
12000 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
12001 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
12002
12003 // .. taken pct: dummy auras
12004 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
12005 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
12006 {
12007 if (!(*i) || !(*i)->GetSpellInfo())
12008 {
12009 continue;
12010 }
12011
12012 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
12013 {
12014 switch (spellIconId)
12015 {
12016 // Cheat Death
12017 case 2109:
12018 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
12019 {
12020 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
12021 // is 22.5% critical strike damage reduction, or 444 resilience.
12022 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
12023 float mod = -1.0f * GetMeleeCritDamageReduction(400);
12024 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
12025 }
12026 break;
12027 }
12028 }
12029 }
12030 return TakenTotalMod;
12031}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4324{
4327}
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4329
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition Object.cpp:1149

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4330{
4331 if (IsCreature())
4333
4334 if (IsFlying() || (!IsControlledByPlayer()))
4335 return;
4336
4337 LiquidData const& liquidData = GetLiquidData();
4338
4339 // remove appropriate auras if we are swimming/not swimming respectively
4340 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4342 else if (!isSwimming())
4344
4345 // liquid aura handling
4346 LiquidTypeEntry const* curLiquid = nullptr;
4347 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4348 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4349
4350 if (curLiquid != _lastLiquid)
4351 {
4354
4355 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4356 _lastLiquid = curLiquid;
4357
4359 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4360 CastSpell(this, curLiquid->SpellId, true);
4361 }
4362}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void UpdateMovementFlags()
Definition Creature.cpp:3449
bool isSwimming() const
Definition Unit.h:1625
bool IsFlying() const
Definition Unit.h:1627
Definition GridTerrainData.h:199
uint32 Entry
Definition GridTerrainData.h:202
Definition DBCStructure.h:1284
uint32 SpellId
Definition DBCStructure.h:1290

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), isSwimming(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1503{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition MotionMaster.cpp:890

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16842{
16844 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16845 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16846 SetObjectScale(std::max(scale, scaleMin));
16847}
@ SPELL_AURA_MOD_SCALE_2
Definition SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition Object.h:120
virtual float GetNativeObjectScale() const
Definition Unit.h:1885

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10584{
10585 while (!m_attackers.empty())
10586 {
10587 AttackerSet::iterator iter = m_attackers.begin();
10588 if (!(*iter)->AttackStop())
10589 {
10590 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10591 m_attackers.erase(iter);
10592 }
10593 }
10594}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), boss_attumen::SpellHit(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5389{
5390 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5391 // we want to have all auras removed, so use your brain when linking events
5392 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5393 {
5394 AuraApplicationMap::iterator aurAppIter;
5395 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5397
5398 AuraMap::iterator aurIter;
5399 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5400 RemoveOwnedAura(aurIter);
5401 }
5402}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5463{
5464 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5465 {
5466 Aura const* aura = iter->second->GetBase();
5467 if (aura->GetSpellInfo()->HasAura(type))
5468 ++iter;
5469 else
5471 }
5472
5473 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5474 {
5475 Aura* aura = iter->second;
5476 if (aura->GetSpellInfo()->HasAura(type))
5477 ++iter;
5478 else
5480 }
5481}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5419{
5420 // used just after dieing to remove all visible auras
5421 // and disable the mods for the passive ones
5422 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5423 {
5424 Aura const* aura = iter->second->GetBase();
5427 else
5428 ++iter;
5429 }
5430
5431 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5432 {
5433 Aura* aura = iter->second;
5436 else
5437 ++iter;
5438 }
5439}
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition SharedDefines.h:654
@ AURA_REMOVE_BY_DEATH
Definition SpellAuraDefines.h:396
bool IsDeathPersistent() const
Definition SpellAuras.cpp:1087

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5442{
5443 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5444 {
5445 Aura const* aura = iter->second->GetBase();
5446 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5448 else
5449 ++iter;
5450 }
5451
5452 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5453 {
5454 Aura* aura = iter->second;
5455 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5457 else
5458 ++iter;
5459 }
5460}
bool IsRequiringDeadTarget() const
Definition SpellInfo.cpp:1222

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11186{
11187 // possessed pet and vehicle
11188 if (IsPlayer())
11190
11191 while (!m_Controlled.empty())
11192 {
11193 Unit* target = *m_Controlled.begin();
11194 m_Controlled.erase(m_Controlled.begin());
11195 if (target->GetCharmerGUID() == GetGUID())
11196 {
11197 target->RemoveCharmAuras();
11198 }
11199 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11200 {
11201 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11202 {
11203 target->ToTempSummon()->UnSummon();
11204 }
11205 }
11206 else
11207 {
11208 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11209 }
11210 }
11211}
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9381
bool IsGuardian() const
Definition Unit.h:745
void RemoveCharmAuras()
Definition Unit.cpp:11293

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6264{
6265 while (!m_dynObj.empty())
6266 m_dynObj.front()->Remove();
6267}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6364{
6365 while(!m_gameObj.empty())
6366 {
6367 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6368 if (go)
6369 {
6371 go->SetRespawnTime(0);
6372 go->Delete();
6373 }
6374 m_gameObj.erase(m_gameObj.begin());
6375 }
6376}
void Delete()
Definition GameObject.cpp:978
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1284

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10963{
10964 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10965 {
10966 Unit* unit = *itr;
10967 ++itr;
10968 if (unit->GetEntry() == entry && unit->IsCreature()
10969 && unit->ToCreature()->IsSummon()) // minion, actually
10970 unit->ToTempSummon()->UnSummon();
10971 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10972 }
10973}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4940{
4941 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4942 {
4943 if (check(iter->second))
4944 {
4945 RemoveAura(iter);
4946 continue;
4947 }
4948 ++iter;
4949 }
4950}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4966{
4967 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4968 {
4969 if (check(iter->second))
4970 {
4971 RemoveAura(iter);
4972 continue;
4973 }
4974 ++iter;
4975 }
4976}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5356{
5357 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5358 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5359 {
5360 Aura* aura = iter->second;
5361 ++iter;
5362 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5363 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5364 {
5365 AuraApplication* aurApp = itr->second;
5366 ++itr;
5367 Unit* target = aurApp->GetTarget();
5368 if (target == this)
5369 continue;
5370 target->RemoveAura(aurApp);
5371 // things linked on aura remove may apply new area aura - so start from the beginning
5372 iter = m_ownedAuras.begin();
5373 }
5374 }
5375
5376 // remove area auras owned by others
5377 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5378 {
5379 if (iter->second->GetBase()->GetOwner() != this)
5380 {
5381 RemoveAura(iter);
5382 }
5383 else
5384 ++iter;
5385 }
5386}
ApplicationMap const & GetApplicationMap()
Definition SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5405{
5406 // in join, remove positive buffs, on end, remove negative
5407 // used to remove positive visible auras in arenas
5408 RemoveAppliedAuras([](AuraApplication const* aurApp)
5409 {
5410 Aura const* aura = aurApp->GetBase();
5411 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5412 && !aura->IsPassive() // don't remove passive auras
5413 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5414 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5415 });
5416}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition SharedDefines.h:580
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition SharedDefines.h:524
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition SharedDefines.h:562
bool IsPositive() const
Definition SpellAuras.h:68
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition Unit.cpp:4939

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Player::TeleportTo().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4919{
4920 if (aura->IsRemoved())
4921 return;
4922 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4923 RemoveAura(aurApp, mode);
4924}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4876{
4877 // we've special situation here, RemoveAura called while during aura removal
4878 // this kind of call is needed only when aura effect removal handler
4879 // or event triggered by it expects to remove
4880 // not yet removed effects of an aura
4881 if (aurApp->GetRemoveMode())
4882 {
4883 // remove remaining effects of an aura
4884 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4885 {
4886 if (aurApp->HasEffect(itr))
4887 aurApp->_HandleEffect(itr, false);
4888 }
4889 return;
4890 }
4891 // no need to remove
4892 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4893 return;
4894
4895 uint32 spellId = aurApp->GetBase()->GetId();
4896 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4897
4898 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4899 {
4900 if (aurApp == iter->second)
4901 {
4902 // Prevent Arena Preparation aura from being removed by player actions
4903 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4904 // Should only be removed by the arena script, once the match starts.
4906 {
4907 return;
4908 }
4909
4910 RemoveAura(iter, mode);
4911 return;
4912 }
4913 else
4914 ++iter;
4915 }
4916}
@ SPELL_AURA_ARENA_PREPARATION
Definition SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4846{
4847 AuraApplication* aurApp = i->second;
4848 // Do not remove aura which is already being removed
4849 if (aurApp->GetRemoveMode())
4850 return;
4851 Aura* aura = aurApp->GetBase();
4852 _UnapplyAura(i, mode);
4853 // Remove aura - for Area and Target auras
4854 if (aura->GetOwner() == this)
4855 aura->Remove(mode);
4856}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), npc_harrison_jones::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), Spell::finish(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_q12096_q12092_bark::HandleDummy(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), spell_handover_reins::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAura(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::boss_bjarngrimAI::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4859{
4860 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4861 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4862 {
4863 Aura const* aura = iter->second->GetBase();
4864 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4865 && (!caster || aura->GetCasterGUID() == caster))
4866 {
4867 RemoveAura(iter, removeMode);
4868 return;
4869 }
4870 else
4871 ++iter;
4872 }
4873}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4995{
4996 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4997 for (AuraMap::iterator iter = range.first; iter != range.second;)
4998 {
4999 Aura* aura = iter->second;
5000 if ((aura->GetType() == UNIT_AURA_TYPE)
5001 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
5002 {
5003 aura->ModStackAmount(-1, removeMode);
5004 return;
5005 }
5006 else
5007 ++iter;
5008 }
5009}
@ UNIT_AURA_TYPE
Definition SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition SpellAuras.cpp:1021
AuraObjectType GetType() const
Definition SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5340{
5341 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5342 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5343 {
5344 Aura const* aura = iter->second->GetBase();
5345 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5347 {
5348 RemoveAura(iter);
5349 continue;
5350 }
5351 ++iter;
5352 }
5353}
@ SPELL_ATTR0_CU_AURA_CC
Definition SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition SpellInfo.cpp:2003

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5180{
5181 // simple check if list is empty
5182 if (m_modAuras[auraType].empty())
5183 return;
5184
5185 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5186 {
5187 Aura* aura = (*iter)->GetBase();
5189
5190 ++iter;
5191 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5192 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5193 {
5194 uint32 removedAuras = m_removedAurasCount;
5195 RemoveAura(aurApp);
5196 if (m_removedAurasCount > removedAuras)
5197 iter = m_modAuras[auraType].begin();
5198 }
5199 }
5200}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5155{
5156 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5157 {
5158 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5159 {
5160 RemoveAura(iter);
5161 iter = m_appliedAuras.lower_bound(spellId);
5162 }
5163 else
5164 ++iter;
5165 }
5166
5167 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5168 {
5169 if (iter->second->GetCastItemGUID() == castItemGuid)
5170 {
5172 iter = m_ownedAuras.lower_bound(spellId);
5173 }
5174 else
5175 ++iter;
5176 }
5177}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4979{
4980 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4981 {
4982 Aura const* aura = iter->second->GetBase();
4983 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4984 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4985 {
4986 RemoveAura(iter, removeMode);
4987 iter = m_appliedAuras.lower_bound(spellId);
4988 }
4989 else
4990 ++iter;
4991 }
4992}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), Player::ApplyItemObtainSpells(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), spell_amanitar_remove_mushroom_power::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), group_commandscript::HandleGroupReviveCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldState::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_felblood_kaelthas::LapseAction(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), spell_quest_test_flight_charging::PerformKick(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_kiljaeden::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_Graveyard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), advisor_baseAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
5012{
5013 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5014 for (AuraMap::iterator iter = range.first; iter != range.second;)
5015 {
5016 Aura* aura = iter->second;
5017 if (aura->GetCasterGUID() == casterGUID)
5018 {
5019 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
5020
5021 // Call OnDispel hook on AuraScript
5022 aura->CallScriptDispel(&dispelInfo);
5023
5025 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5026 else
5027 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5028
5029 // Call AfterDispel hook on AuraScript
5030 aura->CallScriptAfterDispel(&dispelInfo);
5031
5032 switch (aura->GetSpellInfo()->SpellFamilyName)
5033 {
5034 case SPELLFAMILY_HUNTER:
5035 {
5036 // Noxious Stings
5037 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
5038 {
5039 if (Unit* caster = aura->GetCaster())
5040 {
5041 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
5042 {
5043 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
5044 {
5045 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
5046 if (aura->GetUnitOwner())
5047 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
5048 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
5049 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
5050 }
5051 }
5052 }
5053 }
5054 break;
5055 }
5057 {
5058 // Icy Clutch, remove with Frost Fever
5059 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
5060 {
5061 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
5062 RemoveAurasDueToSpell(aureff->GetId());
5063 }
5064 }
5065 default:
5066 break;
5067 }
5068 return;
5069 }
5070 else
5071 ++iter;
5072 }
5073}
void CallScriptDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2390
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.cpp:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2403
Definition Unit.h:297

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5076{
5077 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5078 for (AuraMap::iterator iter = range.first; iter != range.second;)
5079 {
5080 Aura* aura = iter->second;
5081 if (aura->GetCasterGUID() == casterGUID)
5082 {
5083 int32 damage[MAX_SPELL_EFFECTS];
5084 int32 baseDamage[MAX_SPELL_EFFECTS];
5085 uint8 effMask = 0;
5086 uint8 recalculateMask = 0;
5087 Unit* caster = aura->GetCaster();
5088 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5089 {
5090 if (aura->GetEffect(i))
5091 {
5092 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5093 damage[i] = aura->GetEffect(i)->GetAmount();
5094 effMask |= (1 << i);
5095 if (aura->GetEffect(i)->CanBeRecalculated())
5096 recalculateMask |= (1 << i);
5097 }
5098 else
5099 {
5100 baseDamage[i] = 0;
5101 damage[i] = 0;
5102 }
5103 }
5104
5106 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5107 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5108
5109 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5110 {
5111 if (stealCharge)
5112 oldAura->ModCharges(1);
5113 else
5114 oldAura->ModStackAmount(1);
5115 oldAura->SetDuration(int32(dur));
5116 }
5117 else
5118 {
5119 // single target state must be removed before aura creation to preserve existing single target aura
5120 if (aura->IsSingleTarget())
5121 aura->UnregisterSingleTarget();
5122
5123 // Xinef: if stealer has same aura
5124 Aura* curAura = stealer->GetAura(aura->GetId());
5125 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5126 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5127 {
5128 // created aura must not be single target aura,, so stealer won't loose it on recast
5129 if (newAura->IsSingleTarget())
5130 {
5131 newAura->UnregisterSingleTarget();
5132 // bring back single target aura status to the old aura
5133 aura->SetIsSingleTarget(true);
5134 caster->GetSingleCastAuras().push_back(aura);
5135 }
5136 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5137 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5138 newAura->ApplyForTargets();
5139 }
5140 }
5141
5142 if (stealCharge)
5144 else
5146
5147 return;
5148 }
5149 else
5150 ++iter;
5151 }
5152}
bool CanBeRecalculated() const
Definition SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition SpellAuras.cpp:1167
bool IsPermanent() const
Definition SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5203{
5204 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5205 {
5206 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5207 if (spell->Attributes & flags)
5208 RemoveAura(iter);
5209 else
5210 ++iter;
5211 }
5212}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5286{
5287 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5288 {
5289 Aura const* aura = iter->second->GetBase();
5290 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5291 {
5292 SpellInfo const* spell = aura->GetSpellInfo();
5293 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5294 {
5295 RemoveAura(iter);
5296 continue;
5297 }
5298 }
5299 ++iter;
5300 }
5301}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5251{
5252 if (!(m_interruptMask & flag))
5253 return;
5254
5255 // interrupt auras
5256 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5257 {
5258 Aura* aura = (*iter)->GetBase();
5259 ++iter;
5260 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5261 {
5262 uint32 removedAuras = m_removedAurasCount;
5263 RemoveAura(aura);
5264 if (m_removedAurasCount > removedAuras + 1)
5265 iter = m_interruptableAuras.begin();
5266 }
5267 }
5268
5269 // interrupt channeled spell
5271 {
5272 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5273 {
5274 // Do not interrupt if auto shot
5275 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5276 {
5277 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5278 }
5279 }
5280 }
5281
5283}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5323{
5324 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5325 {
5326 Aura const* aura = iter->second->GetBase();
5327 if (!except || aura->GetId() != except)
5328 {
5329 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5330 {
5331 RemoveAura(iter, removemode);
5332 continue;
5333 }
5334 }
5335 ++iter;
5336 }
5337}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11289{
11291}
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18654{
18655 if (!IsCharmed())
18656 return;
18657
18658 if (!charmer)
18659 charmer = GetCharmer();
18660 if (charmer != GetCharmer()) // one aura overrides another?
18661 {
18662 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18663 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18664 // ABORT();
18665 return;
18666 }
18667
18668 CharmType type;
18670 type = CHARM_TYPE_POSSESS;
18671 else if (charmer && charmer->IsOnVehicle(this))
18672 type = CHARM_TYPE_VEHICLE;
18673 else
18674 type = CHARM_TYPE_CHARM;
18675
18676 if (_oldFactionId)
18677 {
18679 _oldFactionId = 0;
18680 }
18681 else
18683
18684 CastStop();
18685 AttackStop();
18686
18687 // xinef: update speed after charming
18688 UpdateSpeed(MOVE_RUN, false);
18689
18690 // xinef: do not break any controlled motion slot
18691 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18692 {
18693 StopMoving();
18695 }
18696 // xinef: if we have any controlled movement, clear active and idle only
18697 else
18699
18701
18702 // xinef: remove stunned flag if owner was mounted
18705
18706 // If charmer still exists
18707 if (!charmer)
18708 return;
18709
18710 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18711 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18712
18713 charmer->SetCharm(this, false);
18714
18716
18717 Player* playerCharmer = charmer->ToPlayer();
18718 if (playerCharmer)
18719 {
18720 switch (type)
18721 {
18722 case CHARM_TYPE_VEHICLE:
18723 playerCharmer->SetClientControl(this, false);
18724 playerCharmer->SetClientControl(charmer, true); // verified
18727 break;
18728 case CHARM_TYPE_POSSESS:
18729 playerCharmer->SetClientControl(this, false);
18730 playerCharmer->SetClientControl(charmer, true); // verified
18735 break;
18736 case CHARM_TYPE_CHARM:
18738 {
18740 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18741 {
18743 if (GetCharmInfo())
18744 GetCharmInfo()->SetPetNumber(0, true);
18745 else
18746 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18747 }
18748 }
18749 break;
18750 default:
18751 break;
18752 }
18753 }
18754
18755 if (Player* player = ToPlayer())
18756 {
18757 sScriptMgr->AnticheatSetUnderACKmount(player);
18758 }
18759
18760 // xinef: restore threat
18761 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18762 {
18763 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18764 if (!IsFriendlyTo(target))
18765 AddThreat(target, itr->second);
18766 }
18767
18768 _charmThreatInfo.clear();
18769
18770 if (Creature* creature = ToCreature())
18771 {
18772 // Vehicle should not attack its passenger after he exists the seat
18773 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18774 if (Attack(charmer, true))
18775 GetMotionMaster()->MoveChase(charmer);
18776
18777 // Creature will restore its old AI on next update
18778 if (creature->AI())
18779 creature->AI()->OnCharmed(false);
18780
18781 // Xinef: Remove movement flag flying
18783 }
18784 else
18785 ToPlayer()->SetClientControl(this, true); // verified
18786
18787 // a guardian should always have charminfo
18788 if (playerCharmer && this != charmer->GetFirstControlled())
18789 playerCharmer->SendRemoveControlBar();
18790
18791 // xinef: Always delete charm info (restores react state)
18792 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18794}
CharmType
Definition CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition CharmInfo.h:47
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition MotionMaster.h:58
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2641
@ CLASS_CONTEXT_PET_CHARM
Definition UnitDefines.h:237
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition UnitDefines.h:198
@ MOVE_RUN
Definition UnitDefines.h:350
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:252
void InitDefault()
Definition MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition MotionMaster.h:194
void MovementExpired(bool reset=true)
Definition MotionMaster.h:180
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:739
void SendRemoveControlBar()
Definition Player.cpp:9798
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12879
void DeleteCharmInfo()
Definition Unit.cpp:15910
void RestoreFaction()
Definition Unit.cpp:18796
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:10975
void StopAttackingInvalidTarget()
Definition Unit.cpp:20037
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1187
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10346
CharmThreatMap _charmThreatInfo
Definition Unit.h:2109
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:728
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition Unit.cpp:14355
uint32 unit_class
Definition CreatureData.h:213

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
963{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6242{
6243 if (m_dynObj.empty())
6244 return false;
6245
6246 bool result = false;
6247 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6248 {
6249 DynamicObject* dynObj = *i;
6250 if (dynObj->GetSpellId() == spellId)
6251 {
6252 dynObj->Remove();
6253 i = m_dynObj.begin();
6254 result = true;
6255 }
6256 else
6257 ++i;
6258 }
6259
6260 return result;
6261}
void Remove()
Definition DynamicObject.cpp:180

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5507{
5508 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5509 {
5510 Aura const* aura = iter->second->GetBase();
5511 SpellInfo const* spellInfo = aura->GetSpellInfo();
5513 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5514 ++iter;
5515 else
5517 }
5518
5519 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5520 {
5521 Aura* aura = iter->second;
5522 SpellInfo const* spellInfo = aura->GetSpellInfo();
5524 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5525 ++iter;
5526 else
5528 }
5529}
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition SharedDefines.h:455
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), ObjectGuid::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1808{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from Object.

15788{
15789 // cleanup
15790 ASSERT(GetGUID());
15791
15792 if (IsInWorld())
15793 {
15795 if (IsVehicle())
15797
15801
15804
15805 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15808
15810
15811 if (GetCharmerGUID())
15812 {
15813 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15814 ABORT();
15815 }
15816
15817 if (Unit* owner = GetOwner())
15818 {
15819 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15820 {
15822 owner->SetMinion((Minion*)this, false);
15823 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15824 //ABORT();
15825 }
15826 }
15827
15830 }
15831}
void RemoveNotOwnSingleTargetAuras()
Definition Unit.cpp:5214
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11301
void RemoveAllDynObjects()
Definition Unit.cpp:6263
void RemoveAreaAurasDueToLeaveWorld()
Definition Unit.cpp:5355
void RemoveBindSightAuras()
Definition Unit.cpp:11288
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11185
void RemoveFromWorld() override
Definition Object.cpp:1182

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6298{
6299 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6300 return;
6301
6303
6304 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6305 {
6306 if (m_ObjectSlot[i] == gameObj->GetGUID())
6307 {
6308 m_ObjectSlot[i].Clear();
6309 break;
6310 }
6311 }
6312
6313 // GO created by some spell
6314 if (uint32 spellid = gameObj->GetSpellId())
6315 {
6316 RemoveAurasDueToSpell(spellid);
6317
6318 if (IsPlayer())
6319 {
6320 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6321 // Need activate spell use for owner
6322 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6323 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6324 ToPlayer()->SendCooldownEvent(createBySpell);
6325 }
6326 }
6327
6328 m_gameObj.remove(gameObj->GetGUID());
6329
6330 if (del)
6331 {
6332 gameObj->SetRespawnTime(0);
6333 gameObj->Delete();
6334 }
6335}
void Clear()
Definition ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11144

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6338{
6339 if (m_gameObj.empty())
6340 return;
6341
6342 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6343 {
6344 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6345 {
6346 if (spellid > 0 && go->GetSpellId() != spellid)
6347 {
6348 ++itr;
6349 continue;
6350 }
6351
6352 go->SetOwnerGUID(ObjectGuid::Empty);
6353 if (del)
6354 {
6355 go->SetRespawnTime(0);
6356 go->Delete();
6357 }
6358 }
6359 m_gameObj.erase(itr++);
6360 }
6361}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
901{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5304{
5305 if (withRoot)
5307
5308 // Snares
5309 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5310 {
5311 Aura const* aura = iter->second->GetBase();
5313 {
5314 RemoveAura(iter);
5315 continue;
5316 }
5317
5318 ++iter;
5319 }
5320}
bool HasEffectMechanic(Mechanics mechanic) const
Definition SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5215{
5216 // single target auras from other casters
5217 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5218 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5219 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5220 // leading to assertion failures if the aura was cast on a player that can
5221 // (and is changing map at the point where this function is called).
5222 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5223 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5224 // to register in m_appliedAuras
5225 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5226 {
5227 Aura const* aura = iter->second;
5228
5229 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5230 RemoveOwnedAura(iter);
5231 else
5232 ++iter;
5233 }
5234
5235 // single target auras at other targets
5236 AuraList& scAuras = GetSingleCastAuras();
5237 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5238 {
5239 Aura* aura = *iter;
5240 if (aura->GetUnitOwner() != this)
5241 {
5242 aura->Remove();
5243 iter = scAuras.begin();
5244 }
5245 else
5246 ++iter;
5247 }
5248}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
720{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_deathstalker_fearleia::sQuestAccept(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4808{
4809 if (aura->IsRemoved())
4810 return;
4811
4812 ASSERT(aura->GetOwner() == this);
4813
4814 uint32 spellId = aura->GetId();
4815 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4816
4817 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4818 {
4819 if (itr->second == aura)
4820 {
4821 RemoveOwnedAura(itr, removeMode);
4822 return;
4823 }
4824 }
4825
4826 ABORT();
4827}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4775{
4776 Aura* aura = i->second;
4777 ASSERT(!aura->IsRemoved());
4778
4779 // if unit currently update aura list then make safe update iterator shift to next
4782
4783 m_ownedAuras.erase(i);
4784 m_removedAuras.push_back(aura);
4785
4786 // Unregister single target aura
4787 if (aura->IsSingleTarget())
4788 aura->UnregisterSingleTarget();
4789
4790 aura->_Remove(removeMode);
4791
4792 i = m_ownedAuras.begin();
4793}
void _Remove(AuraRemoveMode removeMode)
Definition SpellAuras.cpp:574

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAura(), RemoveOwnedAuras(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4796{
4797 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4798 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4799 {
4800 RemoveOwnedAura(itr, removeMode);
4801 itr = m_ownedAuras.lower_bound(spellId);
4802 }
4803 else
4804 ++itr;
4805}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4927{
4928 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4929 {
4930 if (check(iter->second))
4931 {
4932 RemoveOwnedAura(iter);
4933 continue;
4934 }
4935 ++iter;
4936 }
4937}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4953{
4954 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4955 {
4956 if (check(iter->second))
4957 {
4958 RemoveOwnedAura(iter);
4959 continue;
4960 }
4961 ++iter;
4962 }
4963}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17397{
17398 if (!IsPlayer())
17399 return;
17400
17401 m_petAuras.erase(petSpell);
17402 if (Pet* pet = ToPlayer()->GetPet())
17403 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17404 if (Unit* charm = GetCharm())
17405 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17406}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
Todo:
: This isn't right, if a previously active object was set to active with e.g. Mind Vision this will make them no longer active
11279{
11280 m_sharedVision.remove(player);
11281 player->m_isInSharedVisionOf.erase(this);
11282
11284 if (m_sharedVision.empty())
11285 setActive(false);
11286}

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:919

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

704{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), boss_kalecgos::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::Reset(), advisor_baseAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), advisor_baseAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18829{
18830 if (!m_vehicleKit)
18831 return;
18832
18834 delete m_vehicleKit;
18835
18836 m_vehicleKit = nullptr;
18837
18838 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18839 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18841}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:339
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition UnitDefines.h:340
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:720

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1467{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition Unit.cpp:17256

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), GameEventMgr::UpdateEventNPCFlags(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RespondsToCallForHelp()

bool Unit::RespondsToCallForHelp ( ) const
inline
976 {
978 return entry->FactionRespondsToCallForHelp();
979
980 return false;
981 }

References GetFactionTemplateEntry().

Referenced by Creature::CanAssistTo().

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16863{
16864 AuraEffect* handledAura = nullptr;
16865 AuraEffect* handledAuraForced = nullptr;
16866 // try to receive model from transform auras
16868 if (!transforms.empty())
16869 {
16870 // iterate over already applied transform auras - from newest to oldest
16871 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16872 {
16873 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16874 {
16875 if (!handledAura)
16876 handledAura = (*i);
16877 // xinef: prefer negative/forced auras
16878 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16879 {
16880 handledAuraForced = (*i);
16881 break;
16882 }
16883 }
16884 }
16885 }
16886
16887 // Xinef: include clone auras (eg mirror images)
16888 if (!handledAuraForced && !handledAura)
16889 {
16891 if (!cloneAuras.empty())
16892 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16893 handledAura = *i;
16894 }
16895
16897
16898 // xinef: order of execution is important!
16899 // first forced transform auras, then shapeshifts, then normal transform
16900 // transform aura was found
16901 if (handledAuraForced)
16902 {
16903 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16904 return;
16905 }
16906 else if (!shapeshiftAura.empty()) // we've found shapeshift
16907 {
16908 // only one such aura possible at a time
16909 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16910 {
16911 SetDisplayId(modelId);
16912 return;
16913 }
16914 }
16915 else if (handledAura)
16916 {
16917 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16918 return;
16919 }
16920
16921 // no auras found - set modelid to default
16923}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuraEffects.cpp:748
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId)
Definition Unit.cpp:19301

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18797{
18798 if (IsPlayer())
18800 else
18801 {
18803 {
18804 if (Unit* owner = GetOwner())
18805 {
18806 SetFaction(owner->GetFaction());
18807 return;
18808 }
18809 }
18810
18811 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18812 SetFaction(cinfo->faction);
18813 }
18814}
void SetFactionForRace(uint8 race)
Definition Player.cpp:5885

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16768{
16769 if (slot >= MAX_MOTION_SLOT)
16770 return;
16771
16772 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16773 movementGenerator->Resume(timer);
16774}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
19971{
19972 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
19973 float addRage;
19974
19975 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
19976
19977 // Unknown if correct, but lineary adjust rage conversion above level 70
19978 if (GetLevel() > 70)
19979 rageconversion += 13.27f * (GetLevel() - 70);
19980
19981 if (attacker)
19982 {
19983 // see Bornak's bluepost explanation (05/29/2009)
19984 float rageFromDamageDealt = damage / rageconversion * 7.5f;
19985 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
19986 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
19988 }
19989 else
19990 {
19991 addRage = damage / rageconversion * 2.5f;
19992
19993 // Berserker Rage effect
19994 if (HasAura(18499))
19995 addRage *= 3.0f;
19996 }
19997
19998 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
19999
20000 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20001}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition WorldConfig.h:389

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2813{
2814 // This is only wrapper
2815
2816 // Miss chance based on melee
2817 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2818 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2819
2820 // Critical hit chance
2821 float crit_chance = GetUnitCriticalChance(attType, victim);
2822 if (crit_chance < 0)
2823 crit_chance = 0;
2824
2825 float dodge_chance = victim->GetUnitDodgeChance();
2826 float block_chance = victim->GetUnitBlockChance();
2827 float parry_chance = victim->GetUnitParryChance();
2828
2829 // Useful if want to specify crit & miss chances for melee, else it could be removed
2830 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2831
2832 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2833}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition Unit.cpp:3757

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2836{
2837 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2838 {
2839 return MELEE_HIT_EVADE;
2840 }
2841
2842 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2843 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2844
2845 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2846 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2847
2848 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2849
2850 // bonus from skills is 0.04%
2851 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2852 int32 sum = 0, tmp = 0;
2853 int32 roll = urand (0, 10000);
2854
2855 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2856 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2857 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2858
2859 tmp = miss_chance;
2860
2861 if (tmp > 0 && roll < (sum += tmp))
2862 {
2863 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2864 return MELEE_HIT_MISS;
2865 }
2866
2867 // Dodge chance
2868
2869 // only players can't dodge if attacker is behind
2870 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2871 {
2872 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2873 }
2874 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2875 else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))
2876 {
2877 // Reduce dodge chance by attacker expertise rating
2878 if (IsPlayer())
2879 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2880 else
2881 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2882
2883 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2885 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2886
2887 tmp = dodge_chance;
2888
2889 // xinef: if casting or stunned - cant dodge
2890 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2891 tmp = 0;
2892
2893 if ((tmp > 0) // check if unit _can_ dodge
2894 && ((tmp -= skillBonus) > 0)
2895 && roll < (sum += tmp))
2896 {
2897 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2898 return MELEE_HIT_DODGE;
2899 }
2900 }
2901
2902 // parry & block chances
2903
2904 // check if attack comes from behind, nobody can parry or block if attacker is behind
2905 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2906 {
2907 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2908 }
2909 else
2910 {
2911 // Reduce parry chance by attacker expertise rating
2912 if (IsPlayer())
2913 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2914 else
2915 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2916
2917 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PARRY)))
2918 {
2919 tmp = parry_chance;
2920
2921 // xinef: cant parry while casting or while stunned
2922 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2923 tmp = 0;
2924
2925 if (tmp > 0 // check if unit _can_ parry
2926 && (tmp -= skillBonus) > 0
2927 && roll < (sum += tmp))
2928 {
2929 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2930 return MELEE_HIT_PARRY;
2931 }
2932 }
2933
2934 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_BLOCK)))
2935 {
2936 tmp = block_chance;
2937
2938 // xinef: cant block while casting or while stunned
2939 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2940 tmp = 0;
2941
2942 if (tmp > 0 // check if unit _can_ block
2943 && (tmp -= skillBonus) > 0
2944 && roll < (sum += tmp))
2945 {
2946 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2947 return MELEE_HIT_BLOCK;
2948 }
2949 }
2950 }
2951
2952 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2953 if (attType != RANGED_ATTACK &&
2954 (IsPlayer() || IsPet()) &&
2955 !victim->IsPlayer() && !victim->IsPet() &&
2956 GetLevel() < victim->getLevelForTarget(this))
2957 {
2958 // cap possible value (with bonuses > max skill)
2959 int32 skill = attackerWeaponSkill;
2960 int32 maxskill = attackerMaxSkillValueForLevel;
2961 skill = (skill > maxskill) ? maxskill : skill;
2962
2963 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2964 tmp = tmp > 4000 ? 4000 : tmp;
2965 if (roll < (sum += tmp))
2966 {
2967 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2968 return MELEE_HIT_GLANCING;
2969 }
2970 }
2971
2972 // mobs can score crushing blows if they're 4 or more levels above victim
2973 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2974 // can be from by creature (if can) or from controlled player that considered as creature
2977 {
2978 // when their weapon skill is 15 or more above victim's defense skill
2979 tmp = victimDefenseSkill;
2980 int32 tmpmax = victimMaxSkillValueForLevel;
2981 // having defense above your maximum (from items, talents etc.) has no effect
2982 tmp = tmp > tmpmax ? tmpmax : tmp;
2983 // tmp = mob's level * 5 - player's current defense skill
2984 tmp = attackerMaxSkillValueForLevel - tmp;
2985 if (tmp >= 15)
2986 {
2987 // add 2% chance per lacking skill point, min. is 15%
2988 tmp = tmp * 200 - 1500;
2989 if (roll < (sum += tmp))
2990 {
2991 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2992 return MELEE_HIT_CRUSHING;
2993 }
2994 }
2995 }
2996
2997 // Critical chance
2998 tmp = crit_chance;
2999
3000 if (tmp > 0 && roll < (sum += tmp))
3001 {
3002 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
3003 if (IsCreature() && (ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_CRIT)))
3004 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
3005 else
3006 return MELEE_HIT_CRIT;
3007 }
3008
3009 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
3010 return MELEE_HIT_NORMAL;
3011}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition CreatureData.h:62

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21062{
21063 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21064}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17107{
17108 std::list<Unit*> targets;
17109 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17111 Cell::VisitObjects(this, searcher, dist);
17112
17113 // remove current target
17114 if (GetVictim())
17115 targets.remove(GetVictim());
17116
17117 if (exclude)
17118 targets.remove(exclude);
17119
17120 // remove not LoS targets
17121 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17122 {
17123 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17124 {
17125 std::list<Unit*>::iterator tIter2 = tIter;
17126 ++tIter;
17127 targets.erase(tIter2);
17128 }
17129 else
17130 ++tIter;
17131 }
17132
17133 // no appropriate targets
17134 if (targets.empty())
17135 return nullptr;
17136
17137 // select random
17139}
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:13976
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:133
Definition GridNotifiers.h:414

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17072{
17073 std::list<Unit*> targets;
17074 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17076 Cell::VisitObjects(this, searcher, dist);
17077
17078 // remove current target
17079 if (GetVictim())
17080 targets.remove(GetVictim());
17081
17082 if (exclude)
17083 targets.remove(exclude);
17084
17085 // remove not LoS targets
17086 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17087 {
17088 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17089 {
17090 std::list<Unit*>::iterator tIter2 = tIter;
17091 ++tIter;
17092 targets.erase(tIter2);
17093 }
17094 else
17095 ++tIter;
17096 }
17097
17098 // no appropriate targets
17099 if (targets.empty())
17100 return nullptr;
17101
17102 // select random
17104}
Definition GridNotifiers.h:852

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_yazzai::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6580{
6581 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6582
6583 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6584 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6585 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6586 {
6587 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6588 tmpDamage[i] = damageInfo->damages[i].damage;
6589 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6590 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6591 {
6592 tmpAbsorb[i] = tmpDamage[i];
6593 tmpDamage[i] = 0;
6594 }
6595 }
6596
6597 uint32 count = 1;
6598 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6599 {
6600 ++count;
6601 }
6602
6603 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6604 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6605 data << uint32(damageInfo->HitInfo);
6606 data << damageInfo->attacker->GetPackGUID();
6607 data << damageInfo->target->GetPackGUID();
6608 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6609 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6610 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6611 data << uint8(count); // Sub damage count
6612
6613 for (uint32 i = 0; i < count; ++i)
6614 {
6615 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6616 data << float(tmpDamage[i]); // sub damage
6617 data << uint32(tmpDamage[i]); // Sub Damage
6618 }
6619
6621 {
6622 for (uint32 i = 0; i < count; ++i)
6623 {
6624 data << uint32(tmpAbsorb[i]); // Absorb
6625 }
6626 }
6627
6629 {
6630 for (uint32 i = 0; i < count; ++i)
6631 {
6632 data << uint32(damageInfo->damages[i].resist); // Resist
6633 }
6634 }
6635
6636 data << uint8(damageInfo->TargetState);
6637 data << uint32(0); // Unknown attackerstate
6638 data << uint32(0); // Melee spellid
6639
6640 if (damageInfo->HitInfo & HITINFO_BLOCK)
6641 data << uint32(damageInfo->blocked_amount);
6642
6643 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6644 data << uint32(0);
6645
6647 if (damageInfo->HitInfo & HITINFO_UNK1)
6648 {
6649 data << uint32(0);
6650 data << float(0);
6651 data << float(0);
6652 data << float(0);
6653 data << float(0);
6654 data << float(0);
6655 data << float(0);
6656 data << float(0);
6657 data << float(0);
6658 data << float(0); // Found in a loop with 1 iteration
6659 data << float(0); // ditto ^
6660 data << uint32(0);
6661 }
6662
6663 SendMessageToSet(&data, true);
6664}
@ HITINFO_RAGE_GAIN
Definition Unit.h:121
@ HITINFO_UNK1
Definition Unit.h:98
@ SMSG_ATTACKERSTATEUPDATE
Definition Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6667{
6668 CalcDamageInfo dmgInfo;
6669 dmgInfo.HitInfo = HitInfo;
6670 dmgInfo.attacker = this;
6671 dmgInfo.target = target;
6672
6673 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6674 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6675 dmgInfo.damages[0].absorb = AbsorbDamage;
6676 dmgInfo.damages[0].resist = Resist;
6677
6678 dmgInfo.damages[1].damage = 0;
6679 dmgInfo.damages[1].damageSchoolMask = 0;
6680 dmgInfo.damages[1].absorb = 0;
6681 dmgInfo.damages[1].resist = 0;
6682
6683 dmgInfo.TargetState = TargetState;
6684 dmgInfo.blocked_amount = BlockedAmount;
6685 SendAttackStateUpdate(&dmgInfo);
6686}
HitInfo
Definition Unit.h:96

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
19933{
19934 if (!GetThreatMgr().isThreatListEmpty())
19935 {
19936 uint32 count = GetThreatMgr().GetThreatList().size();
19937
19938 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
19939 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
19940 data << GetPackGUID();
19941 data << pHostileReference->getUnitGuid().WriteAsPacked();
19942 data << uint32(count);
19944 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19945 {
19946 data << (*itr)->getUnitGuid().WriteAsPacked();
19947 data << uint32((*itr)->GetThreat() * 100);
19948 }
19949 SendMessageToSet(&data, false);
19950 }
19951}
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
std::list< HostileReference * > StorageType
Definition ThreatMgr.h:147
@ SMSG_HIGHEST_THREAT_UPDATE
Definition Opcodes.h:1184

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20179{
20181 data << GetPackGUID();
20182 SendMessageToSet(&data, false);
20183}
@ SMSG_BREAK_TARGET
Definition Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
19954{
19955 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
19957 data << GetPackGUID();
19958 SendMessageToSet(&data, false);
19959}
@ SMSG_THREAT_CLEAR
Definition Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
16969{
16970 if (m_cleanupDone)
16971 {
16972 return;
16973 }
16974
16976 if (Player* playerMe = ToPlayer())
16977 {
16978 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16979 data << packGUID;
16980 data << uint8(m_comboPoints);
16981 playerMe->SendDirectMessage(&data);
16982 }
16983
16984 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16985 Player* owner = nullptr;
16986 if (ownerGuid.IsPlayer())
16987 {
16988 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16989 }
16990
16991 if (m_movedByPlayer || owner)
16992 {
16993 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16994 data << GetPackGUID();
16995 data << packGUID;
16996 data << uint8(m_comboPoints);
16997
16998 if (m_movedByPlayer)
17000
17001 if (owner && owner != m_movedByPlayer)
17002 owner->SendDirectMessage(&data);
17003 }
17004}
Definition ObjectGuid.h:263
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition Opcodes.h:955

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11357{
11358 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11359 data << victim->GetPackGUID();
11360 data << GetPackGUID();
11361 data << uint32(spellID);
11362 data << uint32(powerType);
11363 data << uint32(damage);
11364 SendMessageToSet(&data, true);
11365}
@ SMSG_SPELLENERGIZELOG
Definition Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11324{
11325 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11326
11327 // we guess size
11328 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11329 data << healInfo.GetTarget()->GetPackGUID();
11330 data << GetPackGUID();
11331 data << uint32(healInfo.GetSpellInfo()->Id);
11332 data << uint32(healInfo.GetHeal());
11333 data << uint32(overheal);
11334 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11335 data << uint8(critical ? 1 : 0);
11336 data << uint8(0); // unused
11337 SendMessageToSet(&data, true);
11338}
@ SMSG_SPELLHEALLOG
Definition Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3091{
3092 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3093 data << GetGUID();
3094 data << victim->GetGUID();
3095 if (sendTo)
3096 sendTo->SendDirectMessage(&data);
3097 else
3098 SendMessageToSet(&data, true);
3099 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3100}
@ SMSG_ATTACKSTART
Definition Opcodes.h:353

References Object::GetGUID(), Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3107{
3108 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3109 // pussywizard: this happens in some boss scripts, just add clearing here
3110 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3111
3112 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3113 data << GetPackGUID();
3114
3115 if (victim)
3116 {
3117 data << victim->GetPackGUID();
3118 data << (uint32)victim->isDead();
3119 }
3120 SendMessageToSet(&data, true);
3121 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3122
3123 if (victim)
3124 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3125 else
3126 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3127}
bool isDead() const
Definition Unit.h:1709
@ SMSG_ATTACKSTOP
Definition Opcodes.h:354

References Object::GetGUID(), Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, and ObjectGuid::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
540{
541 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
542 data << GetPackGUID();
543
544 data << uint8(0); // new in 3.1
545 data << GetPositionX() << GetPositionY() << GetPositionZ();
546 data << GameTime::GetGameTimeMS().count();
547 data << uint8(0);
548 data << uint32(sf);
549 data << TransitTime; // Time in between points
550 data << uint32(1); // 1 single waypoint
551 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
552
553 SendMessageToSet(&data, true);
554}
@ SMSG_MONSTER_MOVE
Definition Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20529{
20530 if (!movespline->Initialized())
20531 return;
20533 data << GetPackGUID();
20534 sendTo->SendDirectMessage(&data);
20535}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16792{
16793 WorldPacket data;
16794 BuildHeartBeatMsg(&data);
16795 SendMessageToSet(&data, self);
16796}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition Object.cpp:2058

References BuildHeartBeatMsg(), and WorldObject::SendMessageToSet().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_madrigosa::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_felmyst::InitializeAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), Player::UpdateCharmedAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20566{
20567 if (!movespline->Initialized())
20568 return;
20570 data << GetPackGUID();
20571 sendTo->SendDirectMessage(&data);
20572}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20507{
20508 if (!movespline->Initialized())
20509 return;
20511 data << GetPackGUID();
20512 sendTo->SendDirectMessage(&data);
20513}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6490{
6491 AuraEffect const* aura = pInfo->auraEff;
6493 data << GetPackGUID();
6494 data << aura->GetCasterGUID().WriteAsPacked();
6495 data << uint32(aura->GetId()); // spellId
6496 data << uint32(1); // count
6497 data << uint32(aura->GetAuraType()); // auraId
6498 switch (aura->GetAuraType())
6499 {
6502 {
6503 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6504 uint32 damage = pInfo->damage;
6505 uint32 absorb = pInfo->absorb;
6506 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6507 {
6508 absorb = damage;
6509 damage = 0;
6510 }
6511
6512 data << uint32(damage); // damage
6513 data << uint32(pInfo->overDamage); // overkill?
6514 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6515 data << uint32(absorb); // absorb
6516 data << uint32(pInfo->resist); // resist
6517 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6518 }
6519 break;
6522 data << uint32(pInfo->damage); // damage
6523 data << uint32(pInfo->overDamage); // overheal
6524 data << uint32(pInfo->absorb); // absorb
6525 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6526 break;
6529 data << uint32(aura->GetMiscValue()); // power type
6530 data << uint32(pInfo->damage); // damage
6531 break;
6533 data << uint32(aura->GetMiscValue()); // power type
6534 data << uint32(pInfo->damage); // amount
6535 data << float(pInfo->multiplier); // gain multiplier
6536 break;
6537 default:
6538 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6539 return;
6540 }
6541
6542 SendMessageToSet(&data, true);
6543}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition Opcodes.h:620
float multiplier
Definition Unit.h:522
bool critical
Definition Unit.h:523
uint32 overDamage
Definition Unit.h:519
uint32 resist
Definition Unit.h:521
uint32 damage
Definition Unit.h:518
AuraEffect const * auraEff
Definition Unit.h:517
uint32 absorb
Definition Unit.h:520

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg)

-------—Pet responses methods--------------—

16696{
16697 Unit* owner = GetOwner();
16698 if (!owner || !owner->IsPlayer())
16699 return;
16700
16702 data << uint8(msg);
16703 owner->ToPlayer()->GetSession()->SendPacket(&data);
16704}
@ SMSG_PET_ACTION_FEEDBACK
Definition Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16719{
16720 Unit* owner = GetOwner();
16721 if (!owner || !owner->IsPlayer())
16722 return;
16723
16724 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16725 data << guid;
16726 data << uint32(AI_REACTION_HOSTILE);
16727 owner->ToPlayer()->GetSession()->SendPacket(&data);
16728}
@ SMSG_AI_REACTION
Definition Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16707{
16708 Unit* owner = GetOwner();
16709 if (!owner || !owner->IsPlayer())
16710 return;
16711
16713 data << GetGUID();
16714 data << uint32(pettalk);
16715 owner->ToPlayer()->GetSession()->SendPacket(&data);
16716}
@ SMSG_PET_ACTION_SOUND
Definition Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, and Object::ToPlayer().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
19021{
19023 data << guid; // target
19024 data << uint32(id); // SpellVisualKit.dbc index
19025 SendMessageToSet(&data, true);
19026}
@ SMSG_PLAY_SPELL_IMPACT
Definition Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
19962{
19963 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
19964 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
19965 data << GetPackGUID();
19966 data << pHostileReference->getUnitGuid().WriteAsPacked();
19967 SendMessageToSet(&data, false);
19968}
@ SMSG_THREAT_REMOVE
Definition Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6570{
6571 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6572 data << GetGUID();
6573 data << target->GetGUID();
6574 data << uint32(spellId);
6575 data << uint8(0); // bool - log format: 0-default, 1-debug
6576 SendMessageToSet(&data, true);
6577}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition Opcodes.h:641

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6560{
6561 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6562 data << GetGUID();
6563 data << target->GetGUID();
6564 data << uint32(spellId);
6565 data << uint8(0); // bool - log format: 0-default, 1-debug
6566 SendMessageToSet(&data, true);
6567}
@ SMSG_PROCRESIST
Definition Opcodes.h:638

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6546{
6547 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6548 data << uint32(spellID);
6549 data << GetGUID();
6550 data << uint8(0); // can be 0 or 1
6551 data << uint32(1); // target count
6552 // for (i = 0; i < target count; ++i)
6553 data << target->GetGUID(); // target GUID
6554 data << uint8(missInfo);
6555 // end loop
6556 SendMessageToSet(&data, true);
6557}
@ SMSG_SPELLLOGMISS
Definition Opcodes.h:617

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6411{
6412 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6413 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6414 uint32 damage = log->damage;
6415 uint32 absorb = log->absorb;
6416 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6417 {
6418 absorb = damage;
6419 damage = 0;
6420 }
6421 data << log->target->GetPackGUID();
6422 data << log->attacker->GetPackGUID();
6423 data << uint32(log->spellInfo->Id);
6424 data << uint32(damage); // damage amount
6425 int32 overkill = damage - log->target->GetHealth();
6426 data << uint32(overkill > 0 ? overkill : 0); // overkill
6427 data << uint8 (log->schoolMask); // damage school
6428 data << uint32(absorb); // AbsorbedDamage
6429 data << uint32(log->resist); // resist
6430 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6431 data << uint8 (log->unused); // unused
6432 data << uint32(log->blocked); // blocked
6433 data << uint32(log->HitInfo);
6434 data << uint32(log->HitInfo);
6436 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6437 //{
6438 // data << float(log->CritRoll);
6439 // data << float(log->CritNeeded);
6440 //}
6441 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6442 //{
6443 // data << float(log->HitRoll);
6444 // data << float(log->HitNeeded);
6445 //}
6446 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6447 //{
6448 // data << float(log->MissChance);
6449 // data << float(log->DodgeChance);
6450 // data << float(log->ParryChance);
6451 // data << float(log->BlockChance);
6452 // data << float(log->GlanceChance);
6453 // data << float(log->CrushChance);
6454 //}
6455 SendMessageToSet(&data, true);
6456}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition SharedDefines.h:1548
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition SharedDefines.h:1551
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition SharedDefines.h:1546
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition Opcodes.h:622
bool physicalLog
Definition Unit.h:504
bool unused
Definition Unit.h:505

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6459{
6460 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6461 log.damage = Damage;
6462 log.absorb = AbsorbedDamage;
6463 log.resist = Resist;
6464 log.physicalLog = PhysicalDamage;
6465 log.blocked = Blocked;
6466 log.HitInfo = 0;
6467 if (CriticalHit)
6468 {
6469 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6470 }
6471 if (Split)
6472 {
6473 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6474 }
6476}
@ SPELL_HIT_TYPE_SPLIT
Definition SharedDefines.h:1549
Definition Unit.h:490

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6379{
6380 // Xinef: function for players only, placed in unit because of cosmetics
6381 if (!IsPlayer())
6382 return;
6383
6384 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6385 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6386 uint32 damage = log->damage;
6387 uint32 absorb = log->absorb;
6388 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6389 {
6390 absorb = damage;
6391 damage = 0;
6392 }
6393 data << log->target->GetPackGUID();
6394 data << attacker->GetPackGUID();
6395 data << uint32(log->spellInfo->Id);
6396 data << uint32(damage); // damage amount
6397 int32 overkill = damage - log->target->GetHealth();
6398 data << uint32(overkill > 0 ? overkill : 0); // overkill
6399 data << uint8 (log->schoolMask); // damage school
6400 data << uint32(absorb); // AbsorbedDamage
6401 data << uint32(log->resist); // resist
6402 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6403 data << uint8 (log->unused); // unused
6404 data << uint32(log->blocked); // blocked
6405 data << uint32(log->HitInfo);
6406 data << uint8 (0); // flag to use extend data
6407 ToPlayer()->SendDirectMessage(&data);
6408}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19834{
19836 data << uint8(result);
19837 ToPlayer()->SendDirectMessage(&data);
19838}
@ SMSG_PET_TAME_FAILURE
Definition Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
19841{
19843 if (IsCreature())
19844 Relocate(&pos);
19845 if (IsPlayer())
19846 {
19847 ToPlayer()->SetCanTeleport(true);
19848 }
19849 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
19850 data2 << GetPackGUID();
19851 BuildMovementPacket(&data2);
19852 if (IsCreature())
19853 Relocate(&oldPos);
19854 if (IsPlayer())
19855 Relocate(&pos);
19856 SendMessageToSet(&data2, false);
19857}
@ MSG_MOVE_TELEPORT
Definition Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
19913{
19914 if (!GetThreatMgr().isThreatListEmpty())
19915 {
19916 uint32 count = GetThreatMgr().GetThreatList().size();
19917
19918 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
19919 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
19920 data << GetPackGUID();
19921 data << uint32(count);
19923 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19924 {
19925 data << (*itr)->getUnitGuid().WriteAsPacked();
19926 data << uint32((*itr)->GetThreat() * 100);
19927 }
19928 SendMessageToSet(&data, false);
19929 }
19930}
@ SMSG_THREAT_UPDATE
Definition Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
649{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
19004{
19005 Aura* aura = target->GetAura(spellId, GetGUID());
19006 if (!aura)
19007 aura = AddAura(spellId, target);
19008 if (aura && stack)
19009 aura->SetStackAmount(stack);
19010}
void SetStackAmount(uint8 num)
Definition SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1139{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

bool Unit::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
virtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

Reimplemented in Player, and Creature.

20472{
20474 return false;
20475
20476 if (enable)
20477 {
20480 }
20481 else
20482 {
20484 }
20485
20486 return true;
20487}
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:389
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition UnitDefines.h:406
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:727

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_MASK_MOVING_FLY, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), Player::SetCanFly(), and Creature::SetCanFly().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17374{
17375 if (apply)
17376 ++m_procDeep;
17377 else
17378 {
17380 --m_procDeep;
17381 }
17382}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10976{
10977 if (apply)
10978 {
10979 if (IsPlayer())
10980 {
10981 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10982 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10983
10984 charm->m_ControlledByPlayer = true;
10986 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10987 }
10988 else
10989 charm->m_ControlledByPlayer = false;
10990
10991 // PvP, FFAPvP
10992 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10993
10994 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10995 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10996
10997 _isWalkingBeforeCharm = charm->IsWalking();
10999 {
11000 charm->SetWalk(false);
11001 charm->SendMovementFlagUpdate();
11002 }
11003
11004 m_Controlled.insert(charm);
11005 }
11006 else
11007 {
11008 if (IsPlayer())
11009 {
11010 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
11011 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
11012 }
11013
11014 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
11015 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
11016
11017 if (charm->IsPlayer())
11018 {
11019 charm->m_ControlledByPlayer = true;
11020 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11021 charm->ToPlayer()->UpdatePvPState();
11022 }
11023 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
11024 {
11025 charm->m_ControlledByPlayer = true;
11026 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11027 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
11028
11029 // Xinef: skip controlled erase if charmed unit is owned by charmer
11030 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
11031 return;
11032 }
11033 else
11034 {
11035 charm->m_ControlledByPlayer = false;
11036 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11037 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
11038 }
11039
11040 if (charm->IsWalking() != _isWalkingBeforeCharm)
11041 {
11042 charm->SetWalk(_isWalkingBeforeCharm);
11043 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
11044 }
11045
11046 m_Controlled.erase(charm);
11047 }
11048}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:675
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:693

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18452{
18453 if (!charmer)
18454 return false;
18455
18456 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18457 {
18458 return false;
18459 }
18460
18461 // dismount players when charmed
18462 if (IsPlayer())
18464
18465 if (charmer->IsPlayer())
18467
18468 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18469 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18470 throw 1;
18471 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18472
18473 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18474 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18475
18476 if (this == charmer)
18477 {
18478 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18479 return false;
18480 }
18481
18482 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18483 // return false;
18484
18485 if (IsPlayer() && ToPlayer()->GetTransport())
18486 {
18487 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18488 return false;
18489 }
18490
18491 // Already charmed
18492 if (GetCharmerGUID())
18493 {
18494 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18495 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18496 return false;
18497 }
18498
18499 CastStop();
18500 AttackStop();
18501
18502 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18503 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18504 // DeleteThreatList();
18505
18506 Player* playerCharmer = charmer->ToPlayer();
18507
18508 // Charmer stop charming
18509 if (playerCharmer)
18510 {
18511 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18512 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18513 }
18514
18515 // Charmed stop charming
18516 if (IsPlayer())
18517 {
18518 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18519 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18520 }
18521
18522 // StopCastingCharm may remove a possessed pet?
18523 if (!IsInWorld())
18524 {
18525 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18526 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18527 return false;
18528 }
18529
18530 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18531 // prevent undefined behaviour
18532 if (aurApp && aurApp->GetRemoveMode())
18533 return false;
18534
18536 SetFaction(charmer->GetFaction());
18537
18538 // Set charmed
18539 charmer->SetCharm(this, true);
18540
18542
18543 if (IsCreature())
18544 {
18545 GetMotionMaster()->Clear(false);
18547 StopMoving();
18548
18549 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18550 {
18551 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18552 Creature* charmed = ToCreature();
18553 charmed->NeedChangeAI = true;
18554 charmed->IsAIEnabled = false;
18555 }
18556 else
18557 {
18558 ToCreature()->AI()->OnCharmed(true);
18559 }
18560
18561 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18562 if (charmer->IsPlayer() && ToCreature()->CanFly())
18564 }
18565 else
18566 {
18567 Player* player = ToPlayer();
18568 if (player->isAFK())
18569 player->ToggleAFK();
18570
18571 player->SetClientControl(this, false); // verified
18572 }
18573
18574 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18575 // prevent undefined behaviour
18576 if (aurApp && aurApp->GetRemoveMode())
18577 return false;
18578
18579 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18580 // Xinef: I need charmInfo for vehicle
18581 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18582 {
18583 InitCharmInfo();
18584 if (type == CHARM_TYPE_POSSESS)
18586 else if (type != CHARM_TYPE_VEHICLE)
18587 {
18589
18590 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18591 if (type == CHARM_TYPE_CONVERT && IsCreature())
18593 }
18594 }
18595
18596 if (playerCharmer)
18597 {
18598 switch (type)
18599 {
18600 case CHARM_TYPE_VEHICLE:
18603 playerCharmer->SetClientControl(this, true); // verified
18604 playerCharmer->VehicleSpellInitialize();
18605 break;
18606 case CHARM_TYPE_POSSESS:
18611 playerCharmer->SetClientControl(this, true); // verified
18612 playerCharmer->PossessSpellInitialize();
18613 break;
18614 case CHARM_TYPE_CHARM:
18616 {
18618 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18619 {
18620 // to prevent client crash
18622
18623 // just to enable stat window
18624 if (GetCharmInfo())
18625 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18626
18627 // if charmed two demons the same session, the 2nd gets the 1st one's name
18628 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18629 }
18630 }
18631 if (playerCharmer->m_seer != this)
18632 {
18634 playerCharmer->CharmSpellInitialize();
18635 }
18636 break;
18637 default:
18638 break;
18639 }
18640 }
18641 else if (IsPlayer())
18643
18644 if (Creature* creature = ToCreature())
18645 creature->RefreshSwimmingFlag();
18646
18647 if (IsPlayer())
18648 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18649
18650 return true;
18651}
@ CHARM_TYPE_CONVERT
Definition CharmInfo.h:48
@ REACT_DEFENSIVE
Definition Unit.h:550
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition CreatureAI.cpp:36
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition Creature.h:95
void MoveIdle()
Definition MotionMaster.cpp:232
void CharmSpellInitialize()
Definition Player.cpp:9744
WorldObject * m_seer
Definition Player.h:2345
void ToggleAFK()
Definition Player.cpp:1304
void PossessSpellInitialize()
Definition Player.cpp:9641
bool isAFK() const
Definition Player.h:1142
void VehicleSpellInitialize()
Definition Player.cpp:9669
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13180
virtual float GetFollowAngle() const
Definition Unit.h:1809
CharmInfo * InitCharmInfo()
Definition Unit.cpp:15902
void InitPossessCreateSpells()
Definition CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition CharmInfo.cpp:98

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
890{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18420{
18421 if (apply)
18422 {
18423 SetTarget();
18425 }
18426 else
18427 {
18428 if (IsAlive())
18429 {
18430 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18431 {
18433 StopMoving();
18434 }
18435
18436 if (GetVictim())
18438 }
18439 }
18440
18441 // xinef: block / allow control to real mover (eg. charmer)
18442 if (IsPlayer())
18443 {
18444 if (m_movedByPlayer)
18445 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18446 //else
18447 // ToPlayer()->SetClientControl(this, !apply);
18448 }
18449}
@ CONFUSED_MOTION_TYPE
Definition MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:292

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17336{
17338
17339 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17340 return;
17341
17342 // check if there any guards that should care about the contested flag on player
17343 if (lookForNearContestedGuards)
17344 {
17345 std::list<Unit*> targets;
17348 Cell::VisitObjects(this, searcher, MAX_AGGRO_RADIUS);
17349
17350 // return if there are no contested guards found
17351 if (!targets.size())
17352 {
17353 return;
17354 }
17355 }
17356
17357 player->SetContestedPvPTimer(30000);
17359 {
17362 // call MoveInLineOfSight for nearby contested guards
17364 }
17366 {
17368 // call MoveInLineOfSight for nearby contested guards
17370 }
17371}
#define MAX_AGGRO_RADIUS
Definition Unit.h:44
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1117
bool InBattleground() const
Definition Player.h:2263
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1871

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18136{
18137 if (apply)
18138 {
18139 if (HasUnitState(state))
18140 return;
18141
18142 AddUnitState(state);
18143 switch (state)
18144 {
18145 case UNIT_STATE_STUNNED:
18146 SetStunned(true);
18147 break;
18148 case UNIT_STATE_ROOT:
18150 SetRooted(true);
18151 break;
18154 {
18157 // SendAutoRepeatCancel ?
18158 SetConfused(true);
18159 CastStop(0, false);
18160 }
18161 break;
18162 case UNIT_STATE_FLEEING:
18164 {
18167 // SendAutoRepeatCancel ?
18168 SetFeared(true, source, isFear);
18169 CastStop(0, false);
18170 }
18171 break;
18172 default:
18173 break;
18174 }
18175
18176 if (IsPlayer())
18177 {
18178 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18179 }
18180 }
18181 else
18182 {
18183 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18184 // xinef: added to each case because of return
18185 //ClearUnitState(state);
18186
18187 switch (state)
18188 {
18189 case UNIT_STATE_STUNNED:
18190 if (HasStunAura())
18191 return;
18192 ClearUnitState(state);
18193 SetStunned(false);
18194 break;
18195 case UNIT_STATE_ROOT:
18196 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18197 if (IsCreature())
18198 {
18199 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18200 {
18201 return;
18202 }
18203 }
18204
18205 if (HasRootAura() || GetVehicle())
18206 return;
18207 ClearUnitState(state);
18208 SetRooted(false);
18209 break;
18211 if (HasConfuseAura())
18212 return;
18213 ClearUnitState(state);
18214 SetConfused(false);
18215 break;
18216 case UNIT_STATE_FLEEING:
18217 if (HasFearAura())
18218 return;
18219 ClearUnitState(state);
18220 SetFeared(false);
18221 break;
18222 default:
18223 return;
18224 }
18225
18226 //ClearUnitState(state);
18227
18229 SetStunned(true);
18230 else
18231 {
18233 SetRooted(true);
18234
18236 SetConfused(true);
18238 {
18239 bool isFear = false;
18240 if (HasFearAura())
18241 {
18242 isFear = true;
18243 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18244 }
18245
18246 if (!source)
18247 {
18248 source = getAttackerForHelper();
18249 }
18250
18251 SetFeared(true, source, isFear);
18252 }
18253 }
18254 }
18255}
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition Unit.cpp:18387
bool HasStunAura() const
Definition Unit.h:1753
void SetConfused(bool apply)
Definition Unit.cpp:18419
void SetStunned(bool apply)
Definition Unit.cpp:18257
Unit * getAttackerForHelper() const
Definition Unit.cpp:755
bool HasConfuseAura() const
Definition Unit.h:1751
void SetRooted(bool apply, bool isStun=false)
Definition Unit.cpp:18305
bool HasRootAura() const
Definition Unit.h:1752
bool HasFearAura() const
Definition Unit.h:1750
Definition Unit.h:258

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skadi::boss_skadiAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_palehoof::boss_palehoofAI::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
4006{
4007 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
4008
4009 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
4010
4011 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
4012 return;
4013
4014 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
4015
4016 // break same type spell if it is not delayed
4017 InterruptSpell(CSpellType, false, true, bySelf);
4018
4019 // special breakage effects:
4020 switch (CSpellType)
4021 {
4023 {
4024 // generic spells always break channeled not delayed spells
4026 {
4027 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4028 {
4030 }
4031 }
4032
4033 // autorepeat breaking
4035 {
4036 // break autorepeat if not Auto Shot
4037 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4039 m_AutoRepeatFirstCast = true;
4040 }
4041
4042 // melee spells breaking
4044 {
4045 // break melee spells if cast time
4046 if (pSpell->GetCastTime() > 0)
4047 {
4049 }
4050 }
4051 if (pSpell->GetCastTime() > 0)
4053
4054 break;
4055 }
4057 {
4058 // channel spells always break generic non-delayed and any channeled spells
4060 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4061
4062 // it also does break autorepeat if not Auto Shot
4064 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4067
4068 break;
4069 }
4071 {
4072 // only Auto Shoot does not break anything
4073 if (pSpell->m_spellInfo->Id != 75)
4074 {
4075 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4077 {
4078 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4079 {
4081 }
4082 }
4083
4085 }
4086 // special action: set first cast flag
4087 m_AutoRepeatFirstCast = true;
4088
4089 break;
4090 }
4091
4092 default:
4093 // other spell types don't break anything now
4094 break;
4095 }
4096
4097 // current spell (if it is still here) may be safely deleted now
4098 if (m_currentSpells[CSpellType])
4099 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4100
4101 // set new current spell
4102 m_currentSpells[CSpellType] = pSpell;
4103 pSpell->SetReferencedFromCurrent(true);
4104
4105 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4106}
CurrentSpellTypes GetCurrentContainer() const
Definition Spell.cpp:7943
Spell ** m_selfContainer
Definition Spell.h:621

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14659{
14660 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14661 // it can be used to check creation of death items (such as soul shards).
14662 m_deathState = s;
14663
14665 {
14666 CombatStop();
14669 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14670
14671 if (IsNonMeleeSpellCast(false))
14673
14674 UnsummonAllTotems(true);
14675 RemoveAllControlled(true);
14677 }
14678
14679 if (s == DeathState::JustDied)
14680 {
14681 // remove aurastates allowing special moves
14684
14685 GetMotionMaster()->Clear(false);
14687
14688 // Xinef: Remove Hover so the corpse can fall to the ground
14689 SetHover(false);
14690
14691 if (despawn)
14692 DisableSpline();
14693 else
14694 StopMoving();
14695
14696 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14697 // do not why since in IncreaseMaxHealth currenthealth is checked
14698 SetHealth(0);
14699 SetPower(getPowerType(), 0);
14700
14701 // Stop emote on death
14703
14704 // players in instance don't have ZoneScript, but they have InstanceScript
14706 zoneScript->OnUnitDeath(this);
14707 }
14708 else if (s == DeathState::JustRespawned)
14709 {
14710 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14711 }
14712}
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:276
void ClearAllReactives()
Definition Unit.cpp:17014
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition Unit.cpp:20537
void ClearDiminishings()
Definition Unit.h:1776
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1197
ZoneScript * GetZoneScript() const
Definition Object.h:627
Definition ZoneScript.h:26

References Alive, MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), JustDied, JustRespawned, m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

◆ SetDisplayId()

◆ SetEmoteState()

void Unit::SetEmoteState ( Emote  emoteState)
inline

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20374{
20375 Movement::MoveSplineInit init(this);
20376 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20378 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20379 init.SetFacing(ori);
20380 init.Launch();
20381}
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18857

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), ResetToHomeOrientation::Execute(), UtherBatteredHiltEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20384{
20385 // never face when already moving
20386 if (!IsStopped())
20387 return;
20388
20390 Movement::MoveSplineInit init(this);
20391 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20392 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20393 init.Launch();
20394}
bool IsStopped() const
Definition Unit.h:1677

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), npc_forest_frog::DoSpawnRandom(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_acherus_necromancer::npc_acherus_necromancerAI::MovementInform(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10131{
10133 if (IsCreature())
10135}
void UpdateMoveInLineOfSightState()
Definition Creature.cpp:2593

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kalecgos::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::boss_volkhanAI::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), InstanceScript::OnPlayerEnter(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), npc_deathstalker_fearleia::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18388{
18389 if (apply)
18390 {
18391 SetTarget();
18392 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18393 }
18394 else
18395 {
18396 if (IsAlive())
18397 {
18398 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18399 {
18401 StopMoving();
18402 }
18403
18404 if (GetVictim())
18406 }
18407 }
18408
18409 // xinef: block / allow control to real mover (eg. charmer)
18410 if (IsPlayer())
18411 {
18412 if (m_movedByPlayer)
18413 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18414 //else
18415 // ToPlayer()->SetClientControl(this, !apply);
18416 }
18417}
@ FLEEING_MOTION_TYPE
Definition MotionMaster.h:49
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition WorldConfig.h:236
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:746

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20516{
20518 return false;
20519
20520 if (enable)
20522 else
20524
20525 return true;
20526}
@ MOVEMENTFLAG_FALLING_SLOW
Definition UnitDefines.h:394

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_FALLING_SLOW, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraFeatherFall(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetFeatherFall(), and Creature::SetFeatherFall().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15584{
15586 val = 0;
15587 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15588 val = 1;
15589 else
15590 {
15591 uint32 maxHealth = GetMaxHealth();
15592 if (maxHealth < val)
15593 val = maxHealth;
15594 }
15595
15596 float prevHealthPct = GetHealthPct();
15597
15599
15600 // mobs that are now or were below 30% need to update their speed
15601 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15602 {
15603 UpdateSpeed(MOVE_RUN, false);
15604 }
15605
15606 // group update
15607 if (IsPlayer())
15608 {
15609 Player* player = ToPlayer();
15610 if (player->NeedSendSpectatorData())
15612
15613 if (player->GetGroup())
15615 }
15616 else if (Pet* pet = ToCreature()->ToPet())
15617 {
15618 if (pet->isControlled())
15619 {
15620 if (Unit* owner = GetOwner())
15621 if (Player* player = owner->ToPlayer())
15622 {
15623 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15624 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15625
15626 if (player->GetGroup())
15628 }
15629 }
15630 }
15631}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition Group.h:113
bool NeedSendSpectatorData() const
Definition Player.cpp:15426
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2484
float GetHealthPct() const
Definition Unit.h:1033
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62

References Dead, WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), JustDied, MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

bool Unit::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

Reimplemented in Creature, and Player.

20538{
20540 return false;
20541
20542 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
20543
20544 if (enable)
20545 {
20547 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
20548 UpdateHeight(GetPositionZ() + hoverHeight);
20549 }
20550 else
20551 {
20553 if (hoverHeight && (!isDying() || !IsCreature()))
20554 {
20555 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
20557 UpdateHeight(newZ);
20558 }
20559 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
20560 }
20561
20562 return true;
20563}
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition Unit.cpp:19905
void SendMovementFlagUpdate(bool self=false)
Definition Unit.cpp:16791
bool isDying() const
Definition Unit.h:1708
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition Object.cpp:1559
float GetFloorZ() const
Definition Object.cpp:3027

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasUnitMovementFlag(), Object::IsCreature(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), UNIT_FIELD_HOVERHEIGHT, WorldObject::UpdateAllowedPositionZ(), and UpdateHeight().

Referenced by AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), setDeathState(), Creature::SetHover(), and Player::SetHover().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
869{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13715

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_felblood_kaelthas::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), instance_zulaman::instance_zulaman_InstanceMapScript::OnCreatureCreate(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13707{
13708 (void)keepCombat;
13709 if (apply)
13711 else
13713}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_tenris_mirkblood::EnterEvadeMode(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), boss_felmyst::InitializeAI(), boss_blackheart_the_inciter::JustEngagedWith(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_tenris_mirkblood::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_felmyst::StartIntro(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13838{
13839 // only alive units can be in combat
13840 if (!IsAlive())
13841 return;
13842
13843 if (PvP)
13844 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13845 else if (duration)
13846 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13847
13849 return;
13850
13851 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13852 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13853 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13854
13855 if (IsInCombat())
13856 return;
13857
13859
13860 if (Creature* creature = ToCreature())
13861 {
13862 // Set home position at place of engaging combat for escorted creatures
13863 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13864 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13865 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13866 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13867
13868 if (enemy)
13869 {
13870 creature->UpdateLeashExtensionTime();
13871
13872 if (IsAIEnabled)
13873 creature->AI()->JustEngagedWith(enemy);
13874
13875 if (creature->GetFormation())
13876 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13877
13878 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13879 }
13880
13881 creature->RefreshSwimmingFlag();
13882
13883 if (IsPet())
13884 {
13885 UpdateSpeed(MOVE_RUN, true);
13886 UpdateSpeed(MOVE_SWIM, true);
13887 UpdateSpeed(MOVE_FLIGHT, true);
13888 }
13889
13890 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13891 Dismount();
13892 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13894 }
13895
13896 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13897 {
13898 Unit* controlled = *itr;
13899 ++itr;
13900
13901 // Xinef: Dont set combat for passive units, they will evade in next update...
13902 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13903 continue;
13904
13905 controlled->SetInCombatState(PvP, enemy, duration);
13906 }
13907
13908 if (Player* player = this->ToPlayer())
13909 {
13910 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13911 }
13912}
@ ESCORT_MOTION_TYPE
Definition MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ CREATURE_TYPE_NON_COMBAT_PET
Definition SharedDefines.h:2650
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition SharedDefines.h:2717
@ MOVE_FLIGHT
Definition UnitDefines.h:355
@ MOVE_SWIM
Definition UnitDefines.h:352
bool HasReactState(ReactStates state) const
Definition Creature.h:97
uint32 GetCombatTimer() const
Definition Unit.h:889
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition Unit.cpp:13837
bool IsStandState() const
Definition Unit.cpp:16807

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13680{
13681 // Xinef: Dont allow to start combat with triggers
13682 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13683 return;
13684
13685 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13686 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13687 {
13688 SetInCombatState(true, enemy, duration);
13689 return;
13690 }
13691
13692 // check for duel
13693 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13694 {
13695 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13696 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13697 {
13698 SetInCombatState(true, enemy, duration);
13699 return;
13700 }
13701 }
13702
13703 SetInCombatState(false, enemy, duration);
13704}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1505{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
948{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1075{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15634{
15635 if (!val)
15636 val = 1;
15637
15638 uint32 health = GetHealth();
15640
15641 // group update
15642 if (IsPlayer())
15643 {
15644 Player* player = ToPlayer();
15645 if (player->NeedSendSpectatorData())
15647
15648 if (player->GetGroup())
15650 }
15651 else if (Pet* pet = ToCreature()->ToPet())
15652 {
15653 if (pet->isControlled())
15654 {
15655 if (Unit* owner = GetOwner())
15656 if (Player* player = owner->ToPlayer())
15657 {
15658 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15659 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15660
15661 if (player->GetGroup())
15663 }
15664 }
15665 }
15666
15667 if (val < health)
15668 SetHealth(val);
15669}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15723{
15724 uint32 cur_power = GetPower(power);
15725 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15726
15727 // group update
15728 if (IsPlayer())
15729 {
15730 Player* player = ToPlayer();
15731 if (getPowerType() == power && player->NeedSendSpectatorData())
15732 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15733
15734 if (player->GetGroup())
15736 }
15737 else if (Pet* pet = ToCreature()->ToPet())
15738 {
15739 if (pet->isControlled())
15740 {
15741 Unit* owner = GetOwner();
15742 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15744 }
15745 }
15746
15747 if (val < cur_power)
15748 SetPower(power, val);
15749}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:787

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10785{
10786 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10787
10788 if (apply)
10789 {
10790 if (minion->GetOwnerGUID())
10791 {
10792 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10793 return;
10794 }
10795
10796 minion->SetOwnerGUID(GetGUID());
10797
10798 m_Controlled.insert(minion);
10799
10800 if (IsPlayer())
10801 {
10802 minion->m_ControlledByPlayer = true;
10804 }
10805
10806 // Can only have one pet. If a new one is summoned, dismiss the old one.
10807 if (minion->IsGuardianPet())
10808 {
10809 if (Guardian* oldPet = GetGuardianPet())
10810 {
10811 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10812 {
10813 // remove existing minion pet
10814 if (Pet* oldPetAsPet = oldPet->ToPet())
10815 {
10816 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10817 }
10818 else
10819 {
10820 oldPet->UnSummon();
10821 }
10822
10823 SetPetGUID(minion->GetGUID());
10825 }
10826 }
10827 else
10828 {
10829 SetPetGUID(minion->GetGUID());
10831 }
10832 }
10833
10835 {
10837 }
10838
10839 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10840 {
10841 SetCritterGUID(minion->GetGUID());
10842 }
10843
10844 // PvP, FFAPvP
10846
10847 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10848 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10849 minion->setPowerType(POWER_ENERGY);
10850
10851 if (IsPlayer())
10852 {
10853 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10854 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10855
10856 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10857 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10858 }
10859 }
10860 else
10861 {
10862 if (minion->GetOwnerGUID() != GetGUID())
10863 {
10864 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10865 return;
10866 }
10867
10868 m_Controlled.erase(minion);
10869
10870 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10871 {
10872 if (GetCritterGUID() == minion->GetGUID())
10874 }
10875
10876 if (minion->IsGuardianPet())
10877 {
10878 if (GetPetGUID() == minion->GetGUID())
10880 }
10881 else if (minion->IsTotem())
10882 {
10883 // All summoned by totem minions must disappear when it is removed.
10884 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10885 {
10886 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10887 {
10888 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10889 continue;
10890
10891 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10892 }
10893 }
10894 }
10895
10896 if (IsPlayer())
10897 {
10898 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10899 // Remove infinity cooldown
10900 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10901 ToPlayer()->SendCooldownEvent(spellInfo);
10902
10903 // xinef: clear spell book
10904 if (m_Controlled.empty())
10906 }
10907
10908 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10909 {
10911 {
10912 // Check if there is another minion
10913 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10914 {
10915 // do not use this check, creature do not have charm guid
10916 //if (GetCharmGUID() == (*itr)->GetGUID())
10917 if (GetGUID() == (*itr)->GetCharmerGUID())
10918 continue;
10919
10920 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10921 if ((*itr)->GetOwnerGUID() != GetGUID())
10922 {
10923 OutDebugInfo();
10924 (*itr)->OutDebugInfo();
10925 ABORT();
10926 }
10927 ASSERT((*itr)->IsCreature());
10928
10929 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLLABLE_GUARDIAN))
10930 continue;
10931
10932 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10933 {
10934 // show another pet bar if there is no charm bar
10935 if (IsPlayer() && !GetCharmGUID())
10936 {
10937 if ((*itr)->IsPet())
10939 else
10941 }
10942 }
10943 break;
10944 }
10945 }
10946 }
10947 }
10948}
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:45
@ SPELL_EFFECT_SUMMON
Definition SharedDefines.h:817
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3549
bool IsGuardianPet() const
Definition TemporarySummon.cpp:391
bool IsPetGhoul() const
Definition TemporarySummon.h:85
void PetSpellInitialize()
Definition Player.cpp:9569
const SummonPropertiesEntry *const m_Properties
Definition TemporarySummon.h:64
uint32 GetSpell(uint8 slot=0) const
Definition Totem.h:59
void OutDebugInfo() const
Definition Unit.cpp:20068
ObjectGuid GetCritterGUID() const
Definition Unit.h:680
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10672
void SetCritterGUID(ObjectGuid guid)
Definition Unit.h:679
void setPowerType(Powers power)
Definition Unit.cpp:10053
void RemoveAllMinionsByEntry(uint32 entry)
Definition Unit.cpp:10962
uint32 Type
Definition DBCStructure.h:1914

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
719{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_deathstalker_fearleia::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10673{
10674 if (GetOwnerGUID() == owner)
10675 return;
10676
10678 if (!owner)
10679 return;
10680
10681 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10682
10683 // Update owner dependent fields
10684 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10685 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10686 return;
10687
10689
10690 UpdateData udata;
10691 WorldPacket packet;
10692 BuildValuesUpdateBlockForPlayer(&udata, player);
10693 udata.BuildPacket(packet);
10694 player->SendDirectMessage(&packet);
10695
10697}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:246
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:195
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11448
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19151{
19152 if (newPhaseMask == GetPhaseMask())
19153 return;
19154
19155 if (IsInWorld())
19156 {
19157 // xinef: to comment, bellow line should be removed
19158 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19159 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19160
19161 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19162 return;
19163
19164 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19165 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19166 {
19167 HostileRefMgr& refMgr = getHostileRefMgr();
19168 HostileReference* ref = refMgr.getFirst();
19169
19170 while (ref)
19171 {
19172 if (Unit* unit = ref->GetSource()->GetOwner())
19173 if (Creature* creature = unit->ToCreature())
19174 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19175
19176 ref = ref->next();
19177 }
19178
19179 // modify threat lists for new phasemask
19180 if (!IsPlayer())
19181 {
19184
19185 // merge expects sorted lists
19186 threatList.sort();
19187 offlineThreatList.sort();
19188 threatList.merge(offlineThreatList);
19189
19190 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19191 if (Unit* unit = (*itr)->getTarget())
19192 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19193 }
19194 }
19195 }
19196
19197 WorldObject::SetPhaseMask(newPhaseMask, false);
19198
19199 if (!IsInWorld())
19200 {
19201 return;
19202 }
19203
19204 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19205 {
19206 Unit* controlled = *itr;
19207 ++itr;
19208 if (controlled->IsCreature())
19209 {
19210 controlled->SetPhaseMask(newPhaseMask, true);
19211 }
19212 }
19213
19214 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19215 {
19216 if (m_SummonSlot[i])
19217 {
19218 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19219 {
19220 summon->SetPhaseMask(newPhaseMask, true);
19221 }
19222 }
19223 }
19224
19225 if (update)
19226 {
19228 }
19229}
Definition HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition HostileRefMgr.h:59
HostileReference * next()
Definition ThreatMgr.h:115
FROM * GetSource() const
Definition Reference.h:97
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition ThreatMgr.h:274
Unit * GetOwner() const
Definition ThreatMgr.h:236
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19150
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2866
uint32 GetPhaseMask() const
Definition Object.h:513

References Map::GetCreature(), HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15672{
15673 if (!fromRegenerate && GetPower(power) == val)
15674 return;
15675
15676 uint32 maxPower = GetMaxPower(power);
15677 if (maxPower < val)
15678 val = maxPower;
15679
15680 if (fromRegenerate)
15681 {
15684 }
15685 else
15687
15688 if (withPowerUpdate)
15689 {
15690 WorldPacket data(SMSG_POWER_UPDATE, 8 + 1 + 4);
15691 data << GetPackGUID();
15692 data << uint8(power);
15693 data << uint32(val);
15694 SendMessageToSet(&data, IsPlayer());
15695 }
15696
15697 // group update
15698 if (IsPlayer())
15699 {
15700 Player* player = ToPlayer();
15701 if (getPowerType() == power && player->NeedSendSpectatorData())
15702 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15703
15704 if (player->GetGroup())
15706 }
15707 else if (Pet* pet = ToCreature()->ToPet())
15708 {
15709 if (pet->isControlled())
15710 {
15711 Unit* owner = GetOwner();
15712 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15714 }
15715
15716 // Update the pet's character sheet with happiness damage bonus
15717 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15718 pet->UpdateDamagePhysical(BASE_ATTACK);
15719 }
15720}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition Group.h:104
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:619
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:652
void AddToObjectUpdateIfNeeded()
Definition Object.cpp:513
@ SMSG_POWER_UPDATE
Definition Opcodes.h:1182

References Object::AddToObjectUpdateIfNeeded(), AsUnderlyingType(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
10054{
10055 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
10056
10057 if (IsPlayer())
10058 {
10059 if (ToPlayer()->GetGroup())
10061 }
10062 else if (Pet* pet = ToCreature()->ToPet())
10063 {
10064 if (pet->isControlled())
10065 {
10066 Unit* owner = GetOwner();
10067 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
10069 }
10070 }
10071
10072 float powerMultiplier = 1.0f;
10073 if (!IsPet())
10074 if (Creature* creature = ToCreature())
10075 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10076
10077 switch (new_powertype)
10078 {
10079 default:
10080 case POWER_MANA:
10081 break;
10082 case POWER_RAGE:
10083 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10084 SetPower(POWER_RAGE, 0);
10085 break;
10086 case POWER_FOCUS:
10087 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10088 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10089 break;
10090 case POWER_ENERGY:
10091 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10092 break;
10093 case POWER_HAPPINESS:
10094 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10095 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10096 break;
10097 }
10098
10099 if (Player const* player = ToPlayer())
10100 if (player->NeedSendSpectatorData())
10101 {
10102 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10103 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10104 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10105 }
10106}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:15722

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
20884{
20885 if (IsPlayer())
20886 m_race = race;
20887}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
905{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition ThreatMgr.h:301

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  isStun = false 
)
protected
18306{
18307 if (apply)
18308 {
18309 if (m_rootTimes > 0) // blizzard internal check?
18310 m_rootTimes++;
18311
18312 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18313 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18314 // setting MOVEMENTFLAG_ROOT
18316
18317 if (IsFalling())
18318 {
18320 }
18321 else
18322 {
18324 }
18325
18326 // Creature specific
18327 if (!IsPlayer())
18328 {
18329 if (isStun && movespline->Finalized())
18330 {
18332 }
18333 else
18334 {
18335 StopMoving();
18336 }
18337 }
18338
18339 if (m_movedByPlayer)
18340 {
18341 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18342 data << GetPackGUID();
18343 data << m_rootTimes;
18345 }
18346 else
18347 {
18349 data << GetPackGUID();
18350 SendMessageToSet(&data, true);
18351 }
18352 }
18353 else
18354 {
18356
18357 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18358 {
18359 if (m_movedByPlayer)
18360 {
18362 data << GetPackGUID();
18363 data << m_rootTimes;
18365 }
18366 else
18367 {
18369 data << GetPackGUID();
18370 SendMessageToSet(&data, true);
18371 }
18372 }
18373 }
18374}
@ MOVEMENTFLAG_PENDING_ROOT
Definition UnitDefines.h:385
void StopMovingOnCurrentPos()
Definition Unit.cpp:16776
@ SMSG_FORCE_MOVE_UNROOT
Definition Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition Opcodes.h:824

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), HasUnitState(), IsFalling(), Object::IsPlayer(), m_movedByPlayer, m_rootTimes, MOVEMENTFLAG_MASK_MOVING, MOVEMENTFLAG_PENDING_ROOT, MOVEMENTFLAG_ROOT, movespline, RemoveUnitMovementFlag(), Player::SendDirectMessage(), WorldObject::SendMessageToSet(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, StopMoving(), StopMovingOnCurrentPos(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
21126{
21128 sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form);
21129}

References Object::SetByteValue(), sScriptMgr, and UNIT_FIELD_BYTES_2.

Referenced by AuraEffect::HandleAuraModShapeshift(), and reset_commandscript::HandleResetStatsOrLevelHelper().

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14535{
14536 if (rate < 0)
14537 rate = 0.0f;
14538
14539 // Update speed only on change
14540 if (m_speed_rate[mtype] == rate)
14541 return;
14542
14543 m_speed_rate[mtype] = rate;
14544
14546
14547 WorldPacket data;
14548 if (!forced)
14549 {
14550 switch (mtype)
14551 {
14552 case MOVE_WALK:
14553 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14554 break;
14555 case MOVE_RUN:
14556 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14557 break;
14558 case MOVE_RUN_BACK:
14559 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14560 break;
14561 case MOVE_SWIM:
14562 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14563 break;
14564 case MOVE_SWIM_BACK:
14565 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14566 break;
14567 case MOVE_TURN_RATE:
14568 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14569 break;
14570 case MOVE_FLIGHT:
14571 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14572 break;
14573 case MOVE_FLIGHT_BACK:
14574 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14575 break;
14576 case MOVE_PITCH_RATE:
14577 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14578 break;
14579 default:
14580 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14581 return;
14582 }
14583
14584 data << GetPackGUID();
14585 BuildMovementPacket(&data);
14586 data << float(GetSpeed(mtype));
14587 SendMessageToSet(&data, true);
14588 }
14589 else
14590 {
14591 if (IsPlayer())
14592 {
14593 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14594 // and do it only for real sent packets and use run for run/mounted as client expected
14595 ++ToPlayer()->m_forced_speed_changes[mtype];
14596
14597 // Xinef: update speed of pet also
14598 if (!IsInCombat())
14599 {
14600 Unit* pet = ToPlayer()->GetPet();
14601 if (!pet)
14602 pet = GetCharm();
14603
14604 // xinef: do not affect vehicles and possesed pets
14605 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14606 pet = nullptr;
14607
14608 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14609 pet->UpdateSpeed(mtype, forced);
14610 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14611 critter->UpdateSpeed(mtype, forced);
14612 }
14613 ToPlayer()->SetCanTeleport(true);
14614 }
14615
14616 switch (mtype)
14617 {
14618 case MOVE_WALK:
14620 break;
14621 case MOVE_RUN:
14623 break;
14624 case MOVE_RUN_BACK:
14626 break;
14627 case MOVE_SWIM:
14629 break;
14630 case MOVE_SWIM_BACK:
14632 break;
14633 case MOVE_TURN_RATE:
14635 break;
14636 case MOVE_FLIGHT:
14638 break;
14639 case MOVE_FLIGHT_BACK:
14641 break;
14642 case MOVE_PITCH_RATE:
14644 break;
14645 default:
14646 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14647 return;
14648 }
14649 data << GetPackGUID();
14650 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14651 if (mtype == MOVE_RUN)
14652 data << uint8(0); // new 2.1.0
14653 data << float(GetSpeed(mtype));
14654 SendMessageToSet(&data, true);
14655 }
14656}
@ FOLLOW_MOTION_TYPE
Definition MotionMaster.h:54
@ MOVE_TURN_RATE
Definition UnitDefines.h:354
@ MOVE_FLIGHT_BACK
Definition UnitDefines.h:356
@ MOVE_SWIM_BACK
Definition UnitDefines.h:353
@ MOVE_PITCH_RATE
Definition UnitDefines.h:357
@ MOVE_RUN_BACK
Definition UnitDefines.h:351
@ MOVE_WALK
Definition UnitDefines.h:349
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:913
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2410
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:14529
void propagateSpeedChange()
Definition Unit.h:1658
@ SMSG_FORCE_TURN_RATE_CHANGE
Definition Opcodes.h:764
@ MSG_MOVE_SET_SWIM_BACK_SPEED
Definition Opcodes.h:243
@ MSG_MOVE_SET_TURN_RATE
Definition Opcodes.h:246
@ SMSG_FORCE_WALK_SPEED_CHANGE
Definition Opcodes.h:760
@ SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE
Definition Opcodes.h:929
@ MSG_MOVE_SET_PITCH_RATE
Definition Opcodes.h:1145
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition Opcodes.h:256
@ SMSG_FORCE_SWIM_BACK_SPEED_CHANGE
Definition Opcodes.h:762
@ SMSG_FORCE_RUN_BACK_SPEED_CHANGE
Definition Opcodes.h:258
@ SMSG_FORCE_FLIGHT_SPEED_CHANGE
Definition Opcodes.h:927
@ SMSG_FORCE_SWIM_SPEED_CHANGE
Definition Opcodes.h:260
@ MSG_MOVE_SET_RUN_SPEED
Definition Opcodes.h:235
@ MSG_MOVE_SET_FLIGHT_SPEED
Definition Opcodes.h:924
@ MSG_MOVE_SET_WALK_SPEED
Definition Opcodes.h:239
@ MSG_MOVE_SET_SWIM_SPEED
Definition Opcodes.h:241
@ MSG_MOVE_SET_FLIGHT_BACK_SPEED
Definition Opcodes.h:926
@ SMSG_FORCE_PITCH_RATE_CHANGE
Definition Opcodes.h:1146
@ MSG_MOVE_SET_RUN_BACK_SPEED
Definition Opcodes.h:237

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, Player::m_forced_speed_changes, m_speed_rate, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_PITCH_RATE, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_TURN_RATE, MOVE_WALK, MSG_MOVE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_SPEED, MSG_MOVE_SET_PITCH_RATE, MSG_MOVE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_SPEED, MSG_MOVE_SET_TURN_RATE, MSG_MOVE_SET_WALK_SPEED, propagateSpeedChange(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_FORCE_TURN_RATE_CHANGE, SMSG_FORCE_WALK_SPEED_CHANGE, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), npc_zuljin_vortex::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::boss_volkhanAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16814{
16816
16817 if (IsStandState())
16819
16820 if (IsPlayer())
16821 {
16823 data << (uint8)state;
16824 ToPlayer()->GetSession()->SendPacket(&data);
16825 }
16826}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), boss_felmyst::InitializeAI(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosa(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18258{
18260 {
18261 return;
18262 }
18263
18264 if (apply)
18265 {
18266 SetTarget();
18268
18269 if (IsPlayer())
18270 {
18272 }
18273
18274 SetRooted(true, true);
18275
18276 CastStop();
18277 }
18278 else
18279 {
18280 if (IsAlive() && GetVictim())
18282
18283 if (IsCreature())
18284 {
18285 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18286 Unit* owner = GetOwner();
18287 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18289
18290 // Xinef: same for charmed npcs
18291 owner = GetCharmer();
18292 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18294 }
18295 else
18297
18298 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18299 {
18300 SetRooted(false, true);
18301 }
18302 }
18303}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ SetTimedFacingToObject()

void Unit::SetTimedFacingToObject ( WorldObject object,
uint32  time 
)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20397{
20398 // never face when already moving
20399 if (!IsStopped() || !time)
20400 return;
20401
20403 Movement::MoveSplineInit init(this);
20404 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20405 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20406 init.Launch();
20407
20408 if (Creature* c = ToCreature())
20409 c->m_Events.AddEvent(new ResetToHomeOrientation(*c), c->m_Events.CalculateTime(time));
20410 else
20411 LOG_ERROR("entities.unit", "Unit::SetTimedFacingToObject called on non-creature unit {}. This should never happen.", GetEntry());
20412}
Definition Unit.cpp:20141

References Position::GetAngle(), Object::GetEntry(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), LOG_ERROR, Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and Object::ToCreature().

Referenced by spell_chapter5_return_to_capital::HandleHit().

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1880{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21187{
21188 Object::SetUInt32Value(index, value);
21189
21190 switch (index)
21191 {
21192 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21193 // We might also need to invalidate the cache for some other fields as well.
21194 case UNIT_FIELD_HEALTH:
21196 break;
21197 }
21198}
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:639
void InvalidateValuesUpdateCache()
Definition Unit.h:2140

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetEmoteState(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

703{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kiljaeden::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_depth_charge::npc_depth_chargeAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21040{
21041 if (slot >= MAX_EQUIPMENT_ITEMS)
21042 return;
21043
21045}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14338{
14339 if (!x)
14341 else
14343
14345}
@ SEC_GAMEMASTER
Definition Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_enslaved_netherwing_drake::MovementInform(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosa(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::boss_ionarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20415{
20416 if (enable == IsWalking())
20417 return false;
20418
20419 if (enable)
20421 else
20423
20425 return true;
20426}

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

bool Unit::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
virtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

Reimplemented in Player, and Creature.

20494{
20496 return false;
20497
20498 if (enable)
20500 else
20502
20503 return true;
20504}
@ MOVEMENTFLAG_WATERWALKING
Definition UnitDefines.h:393

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_WATERWALKING, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
12034{
12035 int32 DoneAdvertisedBenefit = 0;
12036
12038 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
12039 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
12040 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
12041 // -1 == any item class (not wand then)
12042 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
12043 // 0 == any inventory type (not wand then)
12044 DoneAdvertisedBenefit += (*i)->GetAmount();
12045
12046 if (IsPlayer())
12047 {
12048 // Base value
12049 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12050 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellDamageBonus();
12051
12052 // Damage bonus from stats
12054 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
12055 {
12056 if ((*i)->GetMiscValue() & schoolMask)
12057 {
12058 // stat used stored in miscValueB for this aura
12059 Stats usedStat = Stats((*i)->GetMiscValueB());
12060 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12061 }
12062 }
12063 // ... and attack power
12065 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
12066 if ((*i)->GetMiscValue() & schoolMask)
12067 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12068 }
12069 return DoneAdvertisedBenefit;
12070}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition Player.h:1975
uint32 GetBaseSpellDamageBonus()
Definition Player.h:1976

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellDamageBonus(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
12073{
12074 int32 TakenAdvertisedBenefit = 0;
12075
12077 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12078 if (((*i)->GetMiscValue() & schoolMask) != 0)
12079 {
12080 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
12081 // Xinef: required for hemorrhage & rupture / garrote
12082 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
12083 continue;
12084
12085 TakenAdvertisedBenefit += (*i)->GetAmount();
12086 }
12087
12088 return TakenAdvertisedBenefit;
12089}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12800{
12801 int32 AdvertisedBenefit = 0;
12802
12804 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12805 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12806 AdvertisedBenefit += (*i)->GetAmount();
12807
12808 // Healing bonus of spirit, intellect and strength
12809 if (IsPlayer())
12810 {
12811 // Base value
12812 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12813 AdvertisedBenefit += ToPlayer()->GetBaseSpellHealingBonus();
12814
12815 // Healing bonus from stats
12817 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12818 {
12819 // stat used dependent from misc value (stat index)
12820 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12821 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12822 }
12823
12824 // ... and attack power
12826 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12827 if ((*i)->GetMiscValue() & schoolMask)
12828 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12829 }
12830 return AdvertisedBenefit;
12831}
@ SPELL_AURA_MOD_HEALING_DONE
Definition SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition SpellAuraDefines.h:301
uint32 GetBaseSpellHealingBonus()
Definition Player.h:1977

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellHealingBonus(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12834{
12835 int32 AdvertisedBenefit = 0;
12836
12838 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12839 if (((*i)->GetMiscValue() & schoolMask) != 0)
12840 AdvertisedBenefit += (*i)->GetAmount();
12841
12842 return AdvertisedBenefit;
12843}
@ SPELL_AURA_MOD_HEALING
Definition SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12379{
12380 // Calculate critical bonus
12381 int32 crit_bonus = damage;
12382 float crit_mod = 0.0f;
12383
12384 switch (spellProto->DmgClass)
12385 {
12386 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12389 crit_bonus += damage;
12390 break;
12391 default:
12392 crit_bonus += damage / 2; // for spells is 50%
12393 break;
12394 }
12395
12396 if (caster)
12397 {
12398 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12399
12400 if (victim)
12401 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12402
12403 if (crit_bonus != 0 && crit_mod != 0.0f)
12404 AddPct(crit_bonus, crit_mod);
12405
12406 crit_bonus -= damage;
12407
12408 // adds additional damage to critBonus (from talents)
12409 if (Player* modOwner = caster->GetSpellModOwner())
12410 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12411
12412 crit_bonus += damage;
12413 }
12414
12415 return crit_bonus;
12416}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12419{
12420 // Calculate critical bonus
12421 int32 crit_bonus;
12422 switch (spellProto->DmgClass)
12423 {
12424 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12427 crit_bonus = damage;
12428 break;
12429 default:
12430 crit_bonus = damage / 2; // for spells is 50%
12431 break;
12432 }
12433
12434 if (caster)
12435 {
12436 if (victim)
12437 {
12438 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12439 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12440 }
12441
12442 // adds additional damage to critBonus (from talents)
12443 // xinef: used for death knight death coil
12444 if (Player* modOwner = caster->GetSpellModOwner())
12445 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12446 }
12447
12448 if (crit_bonus > 0)
12449 damage += crit_bonus;
12450
12451 if (caster)
12452 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12453
12454 return damage;
12455}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11712{
11713 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11714 return pdamage;
11715
11716 // Some spells don't benefit from done mods
11717 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11718 return pdamage;
11719
11720 // For totems get damage bonus from owner
11721 if (IsCreature())
11722 {
11723 if (IsTotem())
11724 {
11725 if (Unit* owner = GetOwner())
11726 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11727 }
11728 // Dancing Rune Weapon...
11729 else if (GetEntry() == 27893)
11730 {
11731 if (Unit* owner = GetOwner())
11732 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11733 }
11734 }
11735
11736 // Done total percent damage auras
11737 float ApCoeffMod = 1.0f;
11738 int32 DoneTotal = 0;
11739 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11740
11741 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controlled Damage
11743 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11744
11745 // Some spells don't benefit from pct done mods
11746 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11747 {
11748 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11749 // Add flat bonus from spell damage versus
11751 }
11752
11753 // done scripted mod (take it from owner)
11754 Unit* owner = GetOwner() ? GetOwner() : this;
11755 int32 DoneAdvertisedBenefit = 0;
11756 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11757 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11758 {
11759 if (!(*i)->IsAffectedOnSpell(spellProto))
11760 continue;
11761
11762 switch ((*i)->GetMiscValue())
11763 {
11764 case 4418: // Increased Shock Damage
11765 case 4554: // Increased Lightning Damage
11766 case 4555: // Improved Moonfire
11767 case 5142: // Increased Lightning Damage
11768 case 5147: // Improved Consecration / Libram of Resurgence
11769 case 5148: // Idol of the Shooting Star
11770 case 6008: // Increased Lightning Damage
11771 case 8627: // Totem of Hex
11772 {
11773 DoneAdvertisedBenefit += (*i)->GetAmount();
11774 break;
11775 }
11776 }
11777 }
11778
11779 // Custom scripted damage
11780 switch (spellProto->SpellFamilyName)
11781 {
11782 case SPELLFAMILY_DRUID:
11783 {
11784 // Insect Swarm vs Item - Druid T8 Balance Relic
11785 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11786 {
11787 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11788 {
11789 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11790 }
11791 }
11792
11793 // Nourish vs Idol of the Flourishing Life
11794 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11795 {
11796 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11797 {
11798 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11799 }
11800 }
11801 break;
11802 }
11804 {
11805 // Sigil of the Vengeful Heart
11806 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11807 {
11808 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11809 {
11810 AddPct(DoneTotal, aurEff->GetAmount());
11811 }
11812 }
11813
11814 // Impurity
11816 {
11817 AddPct(ApCoeffMod, aurEff->GetAmount());
11818 }
11819
11820 // Blood Boil - bonus for diseased targets
11821 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11822 {
11823 DoneTotal += 95;
11824 ApCoeffMod = 1.5835f;
11825 }
11826 break;
11827 }
11828 default:
11829 break;
11830 }
11831
11832 // Done fixed damage bonus auras
11833 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11834
11835 // Check for table values
11836 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11837 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11838 if (bonus)
11839 {
11840 if (damagetype == DOT)
11841 {
11842 coeff = bonus->dot_damage;
11843 if (bonus->ap_dot_bonus > 0)
11844 {
11845 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11847 APbonus += GetTotalAttackPowerValue(attType);
11848 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11849 }
11850 }
11851 else
11852 {
11853 coeff = bonus->direct_damage;
11854 if (bonus->ap_bonus > 0)
11855 {
11856 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11858 APbonus += GetTotalAttackPowerValue(attType);
11859 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11860 }
11861 }
11862 }
11863
11864 // Default calculation
11865 if (coeff && DoneAdvertisedBenefit)
11866 {
11867 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11868
11869 if (Player* modOwner = GetSpellModOwner())
11870 {
11871 coeff *= 100.0f;
11872 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11873 coeff /= 100.0f;
11874 }
11875
11876 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11877 }
11878
11879 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11880 // apply spellmod to Done damage (flat and pct)
11881 if (Player* modOwner = GetSpellModOwner())
11882 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11883
11884 return uint32(std::max(tmpDamage, 0.0f));
11885}
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition SharedDefines.h:644
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition SpellDefines.h:100
float GetSpellDamageMod(int32 Rank)
Definition Creature.cpp:1622
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:11380
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition Unit.cpp:3069
Definition SpellMgr.h:324
float ap_dot_bonus
Definition SpellMgr.h:328
float dot_damage
Definition SpellMgr.h:326
float ap_bonus
Definition SpellMgr.h:327
float direct_damage
Definition SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11888{
11889 if (!spellProto || damagetype == DIRECT_DAMAGE)
11890 return pdamage;
11891
11892 int32 TakenTotal = 0;
11893 float TakenTotalMod = 1.0f;
11894
11895 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11896 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11898 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11899 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11900 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11901 AddPct(TakenTotalMod, (*i)->GetAmount());
11902
11903 TakenTotalMod = processDummyAuras(TakenTotalMod);
11904
11905 // From caster spells
11906 if (caster)
11907 {
11909 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11910 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11911 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11912 AddPct(TakenTotalMod, (*i)->GetAmount());
11913 }
11914
11915 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11916 {
11917 int32 modifierMax = 0;
11918 int32 modifierMin = 0;
11920 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11921 {
11922 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11923 continue;
11924
11925 // Only death knight spell with this aura
11926 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11927 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11928 continue;
11929
11930 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11931 {
11932 if ((*i)->GetAmount() > 0)
11933 {
11934 if ((*i)->GetAmount() > modifierMax)
11935 modifierMax = (*i)->GetAmount();
11936 }
11937 else if ((*i)->GetAmount() < modifierMin)
11938 modifierMin = (*i)->GetAmount();
11939 }
11940 }
11941
11942 AddPct(TakenTotalMod, modifierMax);
11943 AddPct(TakenTotalMod, modifierMin);
11944 }
11945
11946 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11947
11948 // Check for table values
11949 float coeff = 0;
11950 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11951 if (bonus)
11952 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11953
11954 // Default calculation
11955 if (TakenAdvertisedBenefit)
11956 {
11957 if (coeff <= 0.0f)
11958 {
11959 if (caster)
11960 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11961 else
11962 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11963 }
11964
11965 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11966 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11967 }
11968
11969 // No positive taken bonus, custom attr
11970 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11971 {
11972 TakenTotal = 0;
11973 TakenTotalMod = 1.0f;
11974 }
11975
11976 // xinef: sanctified wrath talent
11977 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
11978 {
11979 float ignoreModifier = 1.0f - TakenTotalMod;
11980 bool addModifier = false;
11982 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11983 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11984 {
11985 ApplyPct(ignoreModifier, (*j)->GetAmount());
11986 addModifier = true;
11987 }
11988
11989 if (addModifier)
11990 TakenTotalMod += ignoreModifier;
11991 }
11992
11993 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11994
11995 return uint32(std::max(tmpDamage, 0.0f));
11996}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition Unit.cpp:17283

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealMeleeDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
12092{
12093 // Mobs can't crit with spells.
12094 if (IsCreature() && !GetSpellModOwner())
12095 return -100.0f;
12096
12097 // not critting spell
12098 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12099 return 0.0f;
12100
12101 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12102 if (!skipEffectCheck && !spellProto->IsCritCapable())
12103 return 0.0f;
12104
12105 float crit_chance = 0.0f;
12106 switch (spellProto->DmgClass)
12107 {
12109 {
12110 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12111 crit_chance = 0.0f;
12112 // For other schools
12113 else if (IsPlayer())
12114 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12115 else
12116 {
12117 crit_chance = (float)m_baseSpellCritChance;
12119 }
12120 break;
12121 }
12124 {
12125 if (IsPlayer())
12126 {
12127 switch (attackType)
12128 {
12129 case BASE_ATTACK:
12131 break;
12132 case OFF_ATTACK:
12134 break;
12135 case RANGED_ATTACK:
12137 break;
12138 default:
12139 break;
12140 }
12141 }
12142 else
12143 {
12144 crit_chance = 5.0f;
12147 }
12149 break;
12150 }
12151 // values overridden in spellmgr for lifebloom and earth shield
12153 default:
12154 return 0.0f;
12155 }
12156
12157 // percent done
12158 // only players use intelligence for critical chance computations
12159 if (Player* modOwner = GetSpellModOwner())
12160 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12161
12162 // xinef: can be negative!
12163 return crit_chance;
12164}
@ SPELL_ATTR2_CANT_CRIT
Definition SharedDefines.h:496
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12550{
12551 // For totems get healing bonus from owner (statue isn't totem in fact)
12552 if (IsCreature() && IsTotem())
12553 if (Unit* owner = GetOwner())
12554 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12555
12556 // No bonus healing for potion spells
12557 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12558 return healamount;
12559
12560 float ApCoeffMod = 1.0f;
12561 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12562 int32 DoneTotal = 0;
12563
12564 // done scripted mod (take it from owner)
12565 Unit* owner = GetOwner() ? GetOwner() : this;
12566 int32 DoneAdvertisedBenefit = 0;
12567 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12568 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12569 {
12570 if (!(*i)->IsAffectedOnSpell(spellProto))
12571 continue;
12572
12573 switch ((*i)->GetMiscValue())
12574 {
12575 case 4415: // Increased Rejuvenation Healing
12576 case 4953:
12577 DoneAdvertisedBenefit += (*i)->GetAmount();
12578 break;
12579 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12580 DoneAdvertisedBenefit += (*i)->GetAmount();
12581 break;
12582 }
12583 }
12584
12585 switch (spellProto->SpellFamilyName)
12586 {
12588 {
12589 // Impurity
12591 {
12592 AddPct(ApCoeffMod, aurEff->GetAmount());
12593 }
12594 break;
12595 }
12596 default:
12597 break;
12598 }
12599
12600 // Done fixed damage bonus auras
12601 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12602 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12603
12604 // Check for table values
12605 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12606 if (bonus)
12607 {
12608 if (damagetype == DOT)
12609 {
12610 coeff = bonus->dot_damage;
12611 if (bonus->ap_dot_bonus > 0)
12612 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12613 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12614 }
12615 else
12616 {
12617 coeff = bonus->direct_damage;
12618 if (bonus->ap_bonus > 0)
12619 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12620 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12621 }
12622 }
12623 else
12624 {
12625 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12626 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12627 return healamount;
12628 }
12629
12630 // Default calculation
12631 if (DoneAdvertisedBenefit)
12632 {
12633 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12634 if (Player* modOwner = GetSpellModOwner())
12635 {
12636 coeff *= 100.0f;
12637 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12638 coeff /= 100.0f;
12639 }
12640 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12641 }
12642
12643 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12644 {
12645 switch (spellProto->Effects[i].ApplyAuraName)
12646 {
12647 // Bonus healing does not apply to these spells
12650 DoneTotal = 0;
12651 break;
12652 }
12653 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12654 DoneTotal = 0;
12655 }
12656
12657 // use float as more appropriate for negative values and percent applying
12658 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12659 // apply spellmod to Done amount
12660
12661 if (Player* modOwner = GetSpellModOwner())
12662 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12663
12664 return uint32(std::max(heal, 0.0f));
12665}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12799
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:12457

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12668{
12669 float TakenTotalMod = 1.0f;
12670 float minval = 0.0f;
12671
12672 // Healing taken percent
12673 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12674 {
12676 }
12677
12678 if (minval)
12679 AddPct(TakenTotalMod, minval);
12680
12682 if (maxval)
12683 AddPct(TakenTotalMod, maxval);
12684
12685 // Tenacity increase healing % taken
12686 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12687 AddPct(TakenTotalMod, Tenacity->GetAmount());
12688
12689 // Healing Done
12690 int32 TakenTotal = 0;
12691
12692 // Taken fixed damage bonus auras
12693 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12694
12695 // Nourish cast, glyph of nourish
12696 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12697 {
12698 bool any = false;
12699 bool hasglyph = caster->GetAuraEffectDummy(62971);
12701 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12702 {
12703 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12704 {
12705 SpellInfo const* spell = (*i)->GetSpellInfo();
12706 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12707 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12708 {
12709 TakenTotalMod *= 1.2f;
12710 any = true;
12711 }
12712
12713 if (hasglyph)
12714 TakenTotalMod += 0.06f;
12715 }
12716 }
12717 }
12718
12719 if (damagetype == DOT)
12720 {
12721 // Healing over time taken percent
12722 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12723 if (minval_hot)
12724 AddPct(TakenTotalMod, minval_hot);
12725
12726 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12727 if (maxval_hot)
12728 AddPct(TakenTotalMod, maxval_hot);
12729 }
12730
12731 // Check for table values
12732 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12733 float coeff = 0;
12734 float factorMod = 1.0f;
12735 if (bonus)
12736 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12737 else
12738 {
12739 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12740 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12741 {
12742 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12743 return healamount;
12744 }
12745 }
12746
12747 // Default calculation
12748 if (TakenAdvertisedBenefit)
12749 {
12750 float TakenCoeff = 0.0f;
12751 if (coeff <= 0)
12752 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12753
12754 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12755 if (Player* modOwner = GetSpellModOwner())
12756 {
12757 coeff *= 100.0f;
12758 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12759 coeff /= 100.0f;
12760 }
12761
12762 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12763 }
12764
12765 if (caster)
12766 {
12768 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12769 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12770 AddPct(TakenTotalMod, (*i)->GetAmount());
12771 }
12772
12773 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12774 {
12775 switch (spellProto->Effects[i].ApplyAuraName)
12776 {
12777 // Bonus healing does not apply to these spells
12780 TakenTotal = 0;
12781 break;
12782 }
12783 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12784 TakenTotal = 0;
12785 }
12786
12787 // No positive taken bonus, custom attr
12788 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12789 {
12790 TakenTotal = 0;
12791 TakenTotalMod = 1.0f;
12792 }
12793
12794 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12795
12796 return uint32(std::max(heal, 0.0f));
12797}
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition SharedDefines.h:642
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition SpellAuraDefines.h:322
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition Unit.cpp:6035
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition Unit.cpp:6049
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition Unit.cpp:12833

References AddPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), SpellInfo::HasAttribute(), flag96::HasFlag(), SpellInfo::Id, MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HEALING_RECEIVED, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3565{
3566 SpellInfo const* spellInfo = spell->GetSpellInfo();
3567
3568 // Check for immune
3569 if (victim->IsImmunedToSpell(spellInfo, spell))
3570 {
3571 return SPELL_MISS_IMMUNE;
3572 }
3573
3574 // All positive spells can`t miss
3576 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3577 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3578 {
3579 return SPELL_MISS_NONE;
3580 }
3581
3582 // Check for immune
3583 // xinef: check for school immunity only
3584 if (victim->IsImmunedToSchool(spell))
3585 {
3586 return SPELL_MISS_IMMUNE;
3587 }
3588
3589 if (this == victim)
3590 {
3591 return SPELL_MISS_NONE;
3592 }
3593
3594 // Return evade for units in evade mode
3595 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3597 {
3598 return SPELL_MISS_EVADE;
3599 }
3600
3601 // Try victim reflect spell
3602 if (CanReflect)
3603 {
3604 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3605 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3606 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3607 {
3608 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3609 {
3610 reflectchance += (*i)->GetAmount();
3611 }
3612 }
3613
3614 if (reflectchance > 0 && roll_chance_i(reflectchance))
3615 {
3616 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3617 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3618 return SPELL_MISS_REFLECT;
3619 }
3620 }
3621
3622 switch (spellInfo->DmgClass)
3623 {
3626 return MeleeSpellHitResult(victim, spellInfo);
3628 {
3629 if (spellInfo->SpellFamilyName)
3630 {
3631 return SPELL_MISS_NONE;
3632 }
3633
3634 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3635 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3636 {
3637 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3638 {
3639 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3640 {
3641 return SPELL_MISS_NONE;
3642 }
3643 }
3644 }
3645 [[fallthrough]];
3646 }
3648 return MagicSpellHitResult(victim, spellInfo);
3649 }
3650
3651 return SPELL_MISS_NONE;
3652}
@ SPELL_EFFECT_DISPEL
Definition SharedDefines.h:827
@ SPELL_MISS_IMMUNE
Definition SharedDefines.h:1537
@ SPELL_MISS_EVADE
Definition SharedDefines.h:1536
@ SPELL_MISS_REFLECT
Definition SharedDefines.h:1541
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3356
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3183

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3500{
3501 // Check for immune
3502 if (victim->IsImmunedToSpell(spell))
3503 return SPELL_MISS_IMMUNE;
3504
3505 // All positive spells can`t miss
3507 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3508 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3509 return SPELL_MISS_NONE;
3510
3511 // Check for immune
3512 // xinef: check for school immunity only
3513 if (victim->IsImmunedToSchool(spell))
3514 return SPELL_MISS_IMMUNE;
3515
3516 if (this == victim)
3517 return SPELL_MISS_NONE;
3518
3519 // Return evade for units in evade mode
3520 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3521 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3522 return SPELL_MISS_EVADE;
3523
3524 // Try victim reflect spell
3525 if (CanReflect)
3526 {
3527 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3528 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3529 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3530 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3531 reflectchance += (*i)->GetAmount();
3532 if (reflectchance > 0 && roll_chance_i(reflectchance))
3533 {
3534 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3535 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3536 return SPELL_MISS_REFLECT;
3537 }
3538 }
3539
3540 switch (spell->DmgClass)
3541 {
3544 return MeleeSpellHitResult(victim, spell);
3546 {
3547 if (spell->SpellFamilyName)
3548 {
3549 return SPELL_MISS_NONE;
3550 }
3551 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3552 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3553 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3554 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3555 return SPELL_MISS_NONE;
3556 [[fallthrough]];
3557 }
3559 return MagicSpellHitResult(victim, spell);
3560 }
3561 return SPELL_MISS_NONE;
3562}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11381{
11382 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11383 return 1.0f;
11384
11385 // Some spells don't benefit from done mods
11386 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11387 return 1.0f;
11388
11389 // For totems get damage bonus from owner
11390 if (IsCreature())
11391 {
11392 if (IsTotem())
11393 {
11394 if (Unit* owner = GetOwner())
11395 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11396 }
11397 // Dancing Rune Weapon...
11398 else if (GetEntry() == 27893)
11399 {
11400 if (Unit* owner = GetOwner())
11401 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11402 }
11403 }
11404
11405 // Done total percent damage auras
11406 float DoneTotalMod = 1.0f;
11407
11409 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11410 {
11411 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11412 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11413 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11414 {
11415 continue;
11416 }
11417
11418 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11419 continue;
11420
11421 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11422 continue;
11423
11424 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11425 {
11426 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11427 AddPct(DoneTotalMod, (*i)->GetAmount());
11428 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11429 AddPct(DoneTotalMod, (*i)->GetAmount());
11430 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11431 AddPct(DoneTotalMod, (*i)->GetAmount());
11432 }
11433 }
11434
11435 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11437 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11438 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11439 AddPct(DoneTotalMod, (*i)->GetAmount());
11440
11441 // bonus against aurastate
11443 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11444 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11445 AddPct(DoneTotalMod, (*i)->GetAmount());
11446
11447 // done scripted mod (take it from owner)
11448 Unit* owner = GetOwner() ? GetOwner() : this;
11449 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11450 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11451 {
11452 // Xinef: self cast is ommited (because of Rage of Rivendare)
11453 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11454 continue;
11455
11456 // xinef: Molten Fury should work on all spells
11457 switch ((*i)->GetMiscValue())
11458 {
11459 case 4920: // Molten Fury
11460 case 4919:
11461 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11462 AddPct(DoneTotalMod, (*i)->GetAmount());
11463 break;
11464 }
11465
11466 if (!(*i)->IsAffectedOnSpell(spellProto))
11467 continue;
11468
11469 switch ((*i)->GetMiscValue())
11470 {
11471 case 6917: // Death's Embrace
11472 case 6926:
11473 case 6928:
11474 {
11475 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11476 AddPct(DoneTotalMod, (*i)->GetAmount());
11477 break;
11478 }
11479 // Soul Siphon
11480 case 4992:
11481 case 4993:
11482 {
11483 // effect 1 m_amount
11484 int32 maxPercent = (*i)->GetAmount();
11485 // effect 0 m_amount
11486 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11487 // count affliction effects and calc additional damage in percentage
11488 int32 modPercent = 0;
11489 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11490 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11491 {
11492 Aura const* aura = itr->second->GetBase();
11493 SpellInfo const* m_spell = aura->GetSpellInfo();
11494 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11495 continue;
11496 modPercent += stepPercent * aura->GetStackAmount();
11497 if (modPercent >= maxPercent)
11498 {
11499 modPercent = maxPercent;
11500 break;
11501 }
11502 }
11503 AddPct(DoneTotalMod, modPercent);
11504 break;
11505 }
11506 case 6916: // Death's Embrace
11507 case 6925:
11508 case 6927:
11509 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11510 AddPct(DoneTotalMod, (*i)->GetAmount());
11511 break;
11512 case 5481: // Starfire Bonus
11513 {
11514 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11515 AddPct(DoneTotalMod, (*i)->GetAmount());
11516 break;
11517 }
11518 // Tundra Stalker
11519 // Merciless Combat
11520 case 7277:
11521 {
11522 // Merciless Combat
11523 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11524 {
11525 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11526 if (!victim->HealthAbovePct(35))
11527 AddPct(DoneTotalMod, (*i)->GetAmount());
11528 }
11529 // Tundra Stalker
11530 else
11531 {
11532 // Frost Fever (target debuff)
11533 if (victim->HasAura(55095))
11534 AddPct(DoneTotalMod, (*i)->GetAmount());
11535 break;
11536 }
11537 break;
11538 }
11539 // Rage of Rivendare
11540 case 7293:
11541 {
11543 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11544 break;
11545 }
11546 // Twisted Faith
11547 case 7377:
11548 {
11550 AddPct(DoneTotalMod, (*i)->GetAmount());
11551 break;
11552 }
11553 // Marked for Death
11554 case 7598:
11555 case 7599:
11556 case 7600:
11557 case 7601:
11558 case 7602:
11559 {
11560 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11561 AddPct(DoneTotalMod, (*i)->GetAmount());
11562 break;
11563 }
11564 // Dirty Deeds
11565 case 6427:
11566 case 6428:
11567 case 6579:
11568 case 6580:
11569 {
11570 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11571 {
11572 // effect 0 has expected value but in negative state
11573 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11574 AddPct(DoneTotalMod, bonus);
11575 }
11576 break;
11577 }
11578 }
11579 }
11580
11581 // Custom scripted damage
11582 switch (spellProto->SpellFamilyName)
11583 {
11584 case SPELLFAMILY_MAGE:
11585 // Ice Lance
11586 if (spellProto->SpellIconID == 186)
11587 {
11588 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11589 {
11590 // Glyph of Ice Lance
11591 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11592 DoneTotalMod *= 4.0f;
11593 else
11594 DoneTotalMod *= 3.0f;
11595 }
11596 }
11597
11598 // Torment the weak
11599 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11600 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11602 AddPct(DoneTotalMod, aurEff->GetAmount());
11603 break;
11604 case SPELLFAMILY_PRIEST:
11605 // Mind Flay
11606 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11607 {
11608 // Glyph of Shadow Word: Pain
11609 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11610 // Increase Mind Flay damage if Shadow Word: Pain present on target
11612 AddPct(DoneTotalMod, aurEff->GetAmount());
11613
11614 // Twisted Faith - Mind Flay part
11616 // Increase Mind Flay damage if Shadow Word: Pain present on target
11618 AddPct(DoneTotalMod, aurEff->GetAmount());
11619 }
11620 // Smite
11621 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11622 {
11623 // Glyph of Smite
11624 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11625 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11626 AddPct(DoneTotalMod, aurEff->GetAmount());
11627 }
11628 // Shadow Word: Death
11629 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11630 {
11631 // Glyph of Shadow Word: Death
11632 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11634 AddPct(DoneTotalMod, aurEff->GetAmount());
11635 }
11636
11637 break;
11639 // Judgement of Vengeance/Judgement of Corruption
11640 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11641 {
11642 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11643 uint32 stacks = 0;
11645 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11646 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11647 {
11648 stacks = (*itr)->GetBase()->GetStackAmount();
11649 break;
11650 }
11651 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11652 if (stacks)
11653 AddPct(DoneTotalMod, 10 * stacks);
11654 }
11655 break;
11656 case SPELLFAMILY_DRUID:
11657 // Thorns
11658 if (spellProto->SpellFamilyFlags[0] & 0x100)
11659 {
11660 // Brambles
11661 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11662 AddPct(DoneTotalMod, aurEff->GetAmount());
11663 }
11664 break;
11666 // Fire and Brimstone
11667 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11669 {
11671 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11672 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11673 {
11674 AddPct(DoneTotalMod, (*i)->GetAmount());
11675 break;
11676 }
11677 }
11678 // Drain Soul - increased damage for targets under 25 % HP
11679 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11680 if (!victim->HealthAbovePct(25))
11681 DoneTotalMod *= 4;
11682 // Shadow Bite (15% increase from each dot)
11683 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11684 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11685 AddPct(DoneTotalMod, 15 * count);
11686 break;
11687 case SPELLFAMILY_HUNTER:
11688 // Steady Shot
11689 if (spellProto->SpellFamilyFlags[1] & 0x1)
11690 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11691 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11692 AddPct(DoneTotalMod, aurEff->GetAmount());
11693 break;
11695 // Improved Icy Touch
11696 if (spellProto->SpellFamilyFlags[0] & 0x2)
11698 AddPct(DoneTotalMod, aurEff->GetAmount());
11699
11700 // Glacier Rot
11701 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11703 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11704 AddPct(DoneTotalMod, aurEff->GetAmount());
11705 break;
11706 }
11707
11708 return DoneTotalMod;
11709}
@ MECHANIC_SLOW_ATTACK
Definition SharedDefines.h:1344
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1304
@ AURA_STATE_CONFLAGRATE
Definition SharedDefines.h:1317
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition Unit.cpp:5913
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition Unit.cpp:5884
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition Unit.cpp:5967

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12458{
12459 // For totems get healing bonus from owner (statue isn't totem in fact)
12460 if (IsCreature() && IsTotem())
12461 if (Unit* owner = GetOwner())
12462 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12463
12464 // Some spells don't benefit from done mods
12465 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12466 return 1.0f;
12467
12468 // xinef: Some spells don't benefit from done mods
12469 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12470 return 1.0f;
12471
12472 // No bonus healing for potion spells
12473 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12474 return 1.0f;
12475
12476 float DoneTotalMod = 1.0f;
12477
12478 // Healing done percent
12480 for (auto const& auraEff : mHealingDonePct)
12481 {
12482 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12483 continue;
12484
12485 AddPct(DoneTotalMod, auraEff->GetAmount());
12486 }
12487
12488 // done scripted mod (take it from owner)
12489 Unit* owner = GetOwner() ? GetOwner() : this;
12490 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12491 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12492 {
12493 if (!(*i)->IsAffectedOnSpell(spellProto))
12494 continue;
12495
12496 switch ((*i)->GetMiscValue())
12497 {
12498 case 21: // Test of Faith
12499 case 6935:
12500 case 6918:
12501 if (victim->HealthBelowPct(50))
12502 AddPct(DoneTotalMod, (*i)->GetAmount());
12503 break;
12504 case 7798: // Glyph of Regrowth
12505 {
12507 AddPct(DoneTotalMod, (*i)->GetAmount());
12508 break;
12509 }
12510
12511 case 7871: // Glyph of Lesser Healing Wave
12512 {
12513 // xinef: affected by any earth shield
12514 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12515 AddPct(DoneTotalMod, (*i)->GetAmount());
12516 break;
12517 }
12518 default:
12519 break;
12520 }
12521 }
12522
12523 switch (spellProto->SpellFamilyName)
12524 {
12526 // Talents and glyphs for healing stream totem
12527 if (spellProto->Id == 52042)
12528 {
12529 // Glyph of Healing Stream Totem
12530 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12531 AddPct(DoneTotalMod, dummy->GetAmount());
12532
12533 // Healing Stream totem - Restorative Totems
12534 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12535 AddPct(DoneTotalMod, aurEff->GetAmount());
12536 }
12537 break;
12538 case SPELLFAMILY_PRIEST:
12539 // T9 HEALING 4P, empowered renew instant heal
12540 if (spellProto->Id == 63544)
12541 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12542 AddPct(DoneTotalMod, aurEff->GetAmount());
12543 break;
12544 }
12545
12546 return DoneTotalMod;
12547}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, and sScriptMgr.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12167{
12168 // not critting spell
12169 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12170 return 0.0f;
12171
12172 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12173 if (!skipEffectCheck && !spellProto->IsCritCapable())
12174 return 0.0f;
12175
12176 float crit_chance = doneChance;
12177 switch (spellProto->DmgClass)
12178 {
12180 {
12181 if (!spellProto->IsPositive())
12182 {
12183 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12184 // xinef: apply max and min only
12186 {
12189 }
12190
12191 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12192 }
12193 // scripted (increase crit chance ... against ... target by x%
12194 if (caster)
12195 {
12196 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12197 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12198 {
12199 if (!((*i)->IsAffectedOnSpell(spellProto)))
12200 continue;
12201 int32 modChance = 0;
12202 switch ((*i)->GetMiscValue())
12203 {
12204 // Shatter
12205 case 911:
12206 modChance += 16;
12207 [[fallthrough]];
12208 case 910:
12209 modChance += 17;
12210 [[fallthrough]];
12211 case 849:
12212 modChance += 17;
12213 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12214 break;
12215 crit_chance += modChance;
12216 break;
12217 case 7917: // Glyph of Shadowburn
12218 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12219 crit_chance += (*i)->GetAmount();
12220 break;
12221 case 7997: // Renewed Hope
12222 case 7998:
12223 if (HasAura(6788))
12224 crit_chance += (*i)->GetAmount();
12225 break;
12226 default:
12227 break;
12228 }
12229 }
12230 // Custom crit by class
12231 switch (spellProto->SpellFamilyName)
12232 {
12233 case SPELLFAMILY_MAGE:
12234 // Glyph of Fire Blast
12235 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12237 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12238 crit_chance += aurEff->GetAmount();
12239 break;
12240 case SPELLFAMILY_DRUID:
12241 // Improved Faerie Fire
12243 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12244 crit_chance += aurEff->GetAmount();
12245
12246 // cumulative effect - don't break
12247
12248 // Starfire
12249 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12250 {
12251 // Improved Insect Swarm
12252 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12254 crit_chance += aurEff->GetAmount();
12255 break;
12256 }
12257 break;
12258 case SPELLFAMILY_ROGUE:
12259 // Shiv-applied poisons can't crit
12260 if (caster->FindCurrentSpellBySpellId(5938))
12261 crit_chance = 0.0f;
12262 break;
12264 // Flash of light
12265 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12266 {
12267 // Sacred Shield
12268 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12269 crit_chance += aura->GetAmount();
12270 break;
12271 }
12272 // Exorcism
12273 else if (spellProto->GetCategory() == 19)
12274 {
12276 return 100.0f;
12277 break;
12278 }
12279 break;
12280 case SPELLFAMILY_SHAMAN:
12281 // Lava Burst
12282 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12283 {
12284 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12286 return 100.0f;
12287 break;
12288 }
12289 break;
12290 }
12291 }
12292 break;
12293 }
12295 // Custom crit by class
12296 if (caster)
12297 {
12298 switch (spellProto->SpellFamilyName)
12299 {
12300 case SPELLFAMILY_DRUID:
12301 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12302 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12303 {
12304 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12305 crit_chance += rendAndTear->GetAmount();
12306 break;
12307 }
12308 break;
12310 // Victory Rush
12311 if (spellProto->SpellFamilyFlags[1] & 0x100)
12312 {
12313 // Glyph of Victory Rush
12314 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12315 crit_chance += aurEff->GetAmount();
12316 break;
12317 }
12318 break;
12319 }
12320 }
12321
12322 // 100% critical chance against sitting target
12324 {
12325 return 100.0f;
12326 }
12327 [[fallthrough]];
12329 {
12330 // flat aura mods
12331 if (attackType == RANGED_ATTACK)
12333 else
12335
12336 // reduce crit chance from Rating for players
12337 if (attackType != RANGED_ATTACK)
12338 {
12339 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12340 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12341 }
12342 else
12343 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12344
12345 // Apply crit chance from defence skill
12346 if (caster)
12347 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12348
12349 break;
12350 }
12351 // values overridden in spellmgr for lifebloom and earth shield
12353 default:
12354 return 0.0f;
12355 }
12356
12357 if (caster)
12358 {
12360 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12361 {
12362 if (caster->GetGUID() != (*i)->GetCasterGUID())
12363 continue;
12364
12365 crit_chance += (*i)->GetAmount();
12366 }
12367 }
12368
12369 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12370 // xinef: should be calculated at the end
12371 if (!spellProto->IsPositive())
12373
12374 // xinef: can be negative!
12375 return crit_chance;
12376}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition SharedDefines.h:2654
@ MECHANIC_KNOCKOUT
Definition SharedDefines.h:1350
@ AURA_STATE_BLEEDING
Definition SharedDefines.h:1321
@ AURA_STATE_FAERIE_FIRE
Definition SharedDefines.h:1315
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition Unit.cpp:6086
bool HasAttackerSpellCritChanceAura() const
Definition Unit.h:1746
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6100

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition Unit.h:591

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20004{
20005 if (Unit* victim = GetVictim())
20006 {
20007 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20008 {
20009 AttackStop();
20010 if (IsNonMeleeSpellCast(false))
20012
20013 // melee and ranged forced attack cancel
20014 if (IsPlayer())
20016 }
20017 }
20018
20019 AttackerSet const& attackers = getAttackers();
20020 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20021 {
20022 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20023 {
20024 (*itr)->AttackStop();
20025 itr = attackers.begin();
20026 }
20027 else
20028 ++itr;
20029 }
20030
20032
20033 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20034 (*itr)->StopAttackFaction(faction_id);
20035}
void deleteReferencesForFaction(uint32 faction)
Definition HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20038{
20039 AttackerSet const& attackers = getAttackers();
20040 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20041 {
20042 Unit* attacker = (*itr);
20043 if (!attacker->IsValidAttackTarget(this))
20044 {
20045 attacker->AttackStop();
20046 if (attacker->IsPlayer())
20047 {
20049 }
20050
20051 for (Unit* controlled : attacker->m_Controlled)
20052 {
20053 if (controlled->GetVictim() == this && !controlled->IsValidAttackTarget(this))
20054 {
20055 controlled->AttackStop();
20056 }
20057 }
20058
20059 itr = attackers.begin();
20060 }
20061 else
20062 {
20063 ++itr;
20064 }
20065 }
20066}

References AttackStop(), getAttackers(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16738{
16740
16741 // not need send any packets if not in world or not moving
16742 if (!IsInWorld())
16743 return;
16744
16745 if (movespline->Finalized())
16746 return;
16747
16748 // Update position now since Stop does not start a new movement that can be updated later
16749 if (movespline->HasStarted())
16751
16752 Movement::MoveSplineInit init(this);
16753 init.Stop();
16754}
bool HasStarted() const
Definition MoveSpline.h:129
void UpdateSplinePosition()
Definition Unit.cpp:609

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_alar::ConstructWaypointsAndMove(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), SmartAI::MoveAway(), boss_headless_horseman::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), boss_felblood_kaelthas::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetRooted(), npc_magister_aledis::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16777{
16779
16780 // not need send any packets if not in world
16781 if (!IsInWorld())
16782 return;
16783
16784 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16785 Movement::MoveSplineInit init(this);
16786 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16787 init.SetFacing(GetOrientation());
16788 init.Launch();
16789}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_janalai::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
20996{
20997 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21000 Cell::VisitObjects(this, worker, textRange);
21001}
Definition ChatTextBuilder.h:49
Definition GridNotifiers.h:1734
Definition GridNotifiers.h:583

References Cell::VisitObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21048{
21049 if (!sObjectMgr->GetBroadcastText(textId))
21050 {
21051 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21052 return;
21053 }
21054
21055 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21058 Cell::VisitObjects(this, worker, textRange);
21059}
Definition ChatTextBuilder.h:31
uint8 getGender() const
Definition Unit.h:798

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14770{
14771 ASSERT(IsCreature());
14772
14773 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14774 return;
14775
14776 if (!CanHaveThreatList())
14777 return;
14778
14779 Creature* creature = ToCreature();
14780
14781 if (creature->HasReactState(REACT_PASSIVE))
14782 return;
14783
14784 Unit* target = GetVictim();
14785 if (target && target == taunter)
14786 return;
14787
14788 SetInFront(taunter);
14789 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14790
14791 if (creature->IsAIEnabled)
14792 creature->AI()->AttackStart(taunter);
14793
14794 //m_ThreatMgr.tauntApply(taunter);
14795}
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20367

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14800{
14801 ASSERT(IsCreature());
14802
14803 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14804 return;
14805
14806 if (!CanHaveThreatList())
14807 return;
14808
14809 Creature* creature = ToCreature();
14810
14811 if (creature->HasReactState(REACT_PASSIVE))
14812 return;
14813
14814 Unit* target = GetVictim();
14815 if (!target || target != taunter)
14816 return;
14817
14819 {
14820 if (creature->IsAIEnabled)
14822 return;
14823 }
14824
14825 target = creature->SelectVictim(); // might have more taunt auras remaining
14826
14827 if (target && target != taunter)
14828 {
14830 SetInFront(target);
14831 if (creature->IsAIEnabled)
14832 creature->AI()->AttackStart(target);
14833 }
14834}
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:90
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition CreatureAI.cpp:215
Unit * SelectVictim()
Definition Unit.cpp:14838
bool isThreatListEmpty() const
Definition ThreatMgr.h:224

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21072{
21073 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21074}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
686{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), CreatureAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), Creature::IsUpdateNeeded(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_jenny::UpdateFollowerAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
687{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
685{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16631{
16632 DamageInfo dmgInfo = DamageInfo(damageInfo);
16633 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16634}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition Unit.cpp:16630

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent(), and TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16656{
16657 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16658 {
16659 if (!(*itr)->GetRemoveMode())
16660 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16661 }
16662}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16637{
16638 // prepare data for self trigger
16639 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16640 std::list<AuraApplication*> myAurasTriggeringProc;
16641 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16642
16643 // prepare data for target trigger
16644 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16645 std::list<AuraApplication*> targetAurasTriggeringProc;
16646 if (typeMaskActionTarget)
16647 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16648
16649 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16650
16651 if (typeMaskActionTarget)
16652 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16653}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition Unit.cpp:16600

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11302{
11303 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11304 {
11305 if (!m_SummonSlot[i])
11306 {
11307 continue;
11308 }
11309
11310 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11311 {
11312 if (OldTotem->IsSummon())
11313 {
11314 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11315 {
11316 OldTotem->ToTempSummon()->UnSummon();
11317 }
11318 }
11319 }
11320 }
11321}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

385{
386 sScriptMgr->OnUnitUpdate(this, p_time);
387
388 // WARNING! Order of execution here is important, do not change.
389 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
390 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
391 WorldObject::Update(p_time);
392
393 if (!IsInWorld())
394 return;
395
396 // pussywizard:
397 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
398 {
400 {
402 {
404 //ExecuteDelayedUnitRelocationEvent();
406 }
407 else
409 }
411 {
412 if (m_delayed_unit_ai_notify_timer <= p_time)
413 {
416 }
417 else
419 }
420 }
421
422 _UpdateSpells( p_time );
423
424 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
426
427 // update combat timer only for players and pets (only pets with PetAI)
429 {
430 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
431 // targets without stopping half way there and running off.
432 // These flags are reset after target dies or another command is given.
434 {
435 // m_CombatTimer set at aura start and it will be freeze until aura removing
436 if (m_CombatTimer <= p_time)
438 else
439 m_CombatTimer -= p_time;
440 }
441 }
442
445 {
446 while (!extraAttacksTargets.empty())
447 {
448 auto itr = extraAttacksTargets.begin();
449 ObjectGuid targetGuid = itr->first;
450 uint32 count = itr->second;
451 extraAttacksTargets.erase(itr);
452 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
453 {
455 || victim->IsWithinMeleeRange(this))
456 {
457 HandleProcExtraAttackFor(victim, count);
458 }
459 }
460 }
462 }
463
464 // not implemented before 3.0.2
465 // xinef: if attack time > 0, reduce by diff
466 // if on next update, attack time < 0 assume player didnt attack - set to 0
467 bool suspendAttackTimer = false;
468 bool suspendRangedAttackTimer = false;
470 {
471 for (Spell* spell : m_currentSpells)
472 {
473 if (spell)
474 {
475 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
476 {
477 if (spell->IsChannelActive())
478 {
479 suspendRangedAttackTimer = true;
480 }
481
482 suspendAttackTimer = true;
483 break;
484 }
485 }
486 }
487 }
488
489 if (!suspendAttackTimer)
490 {
491 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
492 {
493 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
494 }
495
496 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
497 {
498 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
499 }
500 }
501
502 if (!suspendRangedAttackTimer)
503 {
504 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
505 {
506 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
507 }
508 }
509
510 // update abilities available only for fraction of time
511 UpdateReactives(p_time);
512
516
517 UpdateSplineMovement(p_time);
518 GetMotionMaster()->UpdateMotion(p_time);
519
521}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1326
bool IsEmpty() const
Definition LinkedList.h:97
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:233
void UpdateMotion(uint32 diff)
Definition MotionMaster.cpp:104
void _UpdateSpells(uint32 time)
Definition Unit.cpp:3873
void UpdateSplineMovement(uint32 t_diff)
Definition Unit.cpp:577
void UpdateReactives(uint32 p_time)
Definition Unit.cpp:17027
void ExecuteDelayedUnitAINotifyEvent()
Definition Unit.cpp:20356
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition Unit.cpp:2787
void SendThreatListUpdate()
Definition Unit.cpp:19912
virtual void Update(uint32 diff)
Definition Object.cpp:1051

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_STATE_CASTING, WorldObject::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17257{
17258 if (slot >= MAX_AURAS) // slot not found, return
17259 return;
17260 if (Player* player = ToPlayer())
17261 {
17262 if (player->GetGroup())
17263 {
17264 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17265 player->SetAuraUpdateMaskForRaid(slot);
17266 }
17267 }
17268 else if (IsCreature() && IsPet())
17269 {
17270 Pet* pet = ((Pet*)this);
17271 if (pet->isControlled())
17272 {
17273 Unit* owner = GetOwner();
17274 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17275 {
17277 pet->SetAuraUpdateMaskForRaid(slot);
17278 }
17279 }
17280 }
17281}
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition Group.h:109
#define MAX_AURAS
Definition SpellAuraDefines.h:21
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15876{
15877 if (IsPlayer())
15878 return;
15879
15880 if (i_disabledAI) // disabled AI must be primary AI
15881 {
15882 if (!IsCharmed())
15883 {
15884 delete i_AI;
15886 i_disabledAI = nullptr;
15887 }
15888 }
15889 else
15890 {
15891 if (IsCharmed())
15892 {
15894 if (isPossessed() || IsVehicle())
15895 i_AI = new PossessedAI(ToCreature());
15896 else
15897 i_AI = new PetAI(ToCreature());
15898 }
15899 }
15900}
Definition PetAI.h:47
Definition PassiveAI.h:37

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:779

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

19906{
19908 if (IsVehicle())
19910}
void RelocatePassengers()
Definition Vehicle.cpp:514

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset(), and SetHover().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
770{
771 m_interruptMask = 0;
772 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
773 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
774
776 if (spell->getState() == SPELL_STATE_CASTING)
777 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
778}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

19898{
19899 SetOrientation(orientation);
19900 if (IsVehicle())
19902}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

19860{
19861 if (!Acore::IsValidMapCoord(x, y, z, orientation))
19862 return false;
19863
19864 float old_orientation = GetOrientation();
19865 float current_z = GetPositionZ();
19866 bool turn = (old_orientation != orientation);
19867 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
19868
19869 if (!GetVehicle())
19870 {
19871 uint32 mask = 0;
19872 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
19873 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
19874 if (mask)
19876 }
19877
19878 if (relocated)
19879 {
19880 if (IsPlayer())
19881 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
19882 else
19883 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
19884 }
19885 else if (turn)
19886 {
19887 UpdateOrientation(orientation);
19888
19889 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
19891 }
19892
19893 return (relocated || turn);
19894}
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition Map.cpp:780
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition Map.cpp:802
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition Unit.cpp:19897
bool IsValidMapCoord(float c)
Definition GridDefines.h:210

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveRootAck(), WorldSession::HandleMoveUnRootAck(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_skadi::boss_skadiAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
17028{
17029 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17030 {
17031 ReactiveType reactive = ReactiveType(i);
17032
17033 if (!m_reactiveTimer[reactive])
17034 continue;
17035
17036 if (m_reactiveTimer[reactive] <= p_time)
17037 {
17038 m_reactiveTimer[reactive] = 0;
17039
17040 switch (reactive)
17041 {
17042 case REACTIVE_DEFENSE:
17045 break;
17049 break;
17050 case REACTIVE_OVERPOWER:
17052 {
17054 }
17055 break;
17057 if (IsHunterPet())
17059 break;
17060 default:
17061 break;
17062 }
17063 }
17064 else
17065 {
17066 m_reactiveTimer[reactive] -= p_time;
17067 }
17068 }
17069}
ReactiveType
Definition Unit.h:594

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14356{
14357 int32 main_speed_mod = 0;
14358 float stack_bonus = 1.0f;
14359 float non_stack_bonus = 1.0f;
14360
14361 switch (mtype)
14362 {
14363 // Only apply debuffs
14364 case MOVE_FLIGHT_BACK:
14365 case MOVE_RUN_BACK:
14366 case MOVE_SWIM_BACK:
14367 case MOVE_WALK:
14368 break;
14369 case MOVE_RUN:
14370 {
14371 if (IsMounted()) // Use on mount auras
14372 {
14376 }
14377 else
14378 {
14382 }
14383 break;
14384 }
14385 case MOVE_SWIM:
14386 {
14387 // xinef: check for forced_speed_mod of sea turtle
14389 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14390 {
14391 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14392 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14393 {
14394 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14395 return;
14396 }
14397 else if (
14398 // case: increase speed
14399 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14400 // case: decrease speed
14401 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14402 )
14403 {
14404 main_speed_mod = (*itr)->GetAmount();
14405 }
14406 }
14407 break;
14408 }
14409 case MOVE_FLIGHT:
14410 {
14411 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14412 {
14415
14416 // for some spells this mod is applied on vehicle owner
14417 int32 owner_speed_mod = 0;
14418
14419 if (Unit* owner = GetCharmer())
14420 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14421
14422 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14423 }
14424 else if (IsMounted())
14425 {
14429 }
14430 else // Use not mount (shapeshift for example) auras (should stack)
14431 {
14435 }
14436
14437 // Update speed for vehicle if available
14438 if (IsPlayer() && GetVehicle())
14440 break;
14441 }
14442 default:
14443 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14444 return;
14445 }
14446
14447 // now we ready for speed calculation
14448 float speed = std::max(non_stack_bonus, stack_bonus);
14449 if (main_speed_mod)
14450 AddPct(speed, main_speed_mod);
14451
14452 switch (mtype)
14453 {
14454 case MOVE_RUN:
14455 case MOVE_SWIM:
14456 case MOVE_FLIGHT:
14457 {
14458 // Set creature speed rate
14459 if (IsCreature())
14460 {
14461 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14462 {
14463 // contant value for player pets
14464 speed *= 1.15f;
14465 }
14466 else
14467 {
14468 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14469 }
14470 }
14471
14472 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14475 {
14476 if (Creature* creature = ToCreature())
14477 {
14478 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14479 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14480 break;
14481 }
14482
14483 // Use speed from aura
14484 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14485 if (speed > max_speed)
14486 speed = max_speed;
14487 }
14488 break;
14489 }
14490 default:
14491 break;
14492 }
14493
14494 int32 slowFromHealth = 0;
14495 Creature* creature = ToCreature();
14496 // ignore pets, player owned vehicles, and mobs immune to snare
14497 if (creature
14498 && !IsPet()
14499 && !(IsControlledByPlayer() && IsVehicle())
14501 && !(creature->IsDungeonBoss()))
14502 {
14503 // 1.6% for each % under 30.
14504 // use min(0, health-30) so that we don't boost mobs above 30.
14505 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14506 }
14507
14508 if (slowFromHealth)
14509 {
14510 AddPct(speed, slowFromHealth);
14511 }
14512
14513 // Apply strongest slow aura mod to speed
14515 if (slow)
14516 AddPct(speed, slow);
14517
14518 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14519 {
14520 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14521 float min_speed = base_speed * (minSpeedMod / 100.0f);
14522 if (speed < min_speed)
14523 speed = min_speed;
14524 }
14525
14526 SetSpeed(mtype, speed, forced);
14527}
@ MECHANIC_DAZE
Definition SharedDefines.h:1363
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition SpellAuraDefines.h:254
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition Unit.cpp:14534
float speed_run
Definition CreatureData.h:201

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
578{
579 if (movespline->Finalized())
580 return;
581
582 // xinef: process movementinform
583 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
584 SplineHandler handler(this);
585 movespline->updateState(t_diff, handler);
586 // Xinef: Spline was cleared by StopMoving, return
587 if (!movespline->Initialized())
588 {
590 return;
591 }
592
593 bool arrived = movespline->Finalized();
594
595 if (arrived)
596 {
598
599 if (movespline->HasAnimation() && IsCreature() && IsAlive())
601 }
602
603 // pussywizard: update always! not every 400ms, because movement generators need the actual position
604 //m_movesplineTimer.Update(t_diff);
605 //if (m_movesplineTimer.Passed() || arrived)
607}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition UnitDefines.h:26
uint8 GetAnimationType() const
Definition MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition MoveSpline.h:98
bool HasAnimation() const
Definition MoveSpline.h:124
Definition Unit.cpp:557

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, Object::SetByteValue(), UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
610{
611 //static uint32 const positionUpdateDelay = 400;
612
613 //m_movesplineTimer.Reset(positionUpdateDelay);
615
617 {
619 pos.m_positionX = loc.x;
620 pos.m_positionY = loc.y;
621 pos.m_positionZ = loc.z;
623
624 if (TransportBase* transport = GetDirectTransport())
625 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
626 }
627
628 // Xinef: if we had spline running update orientation along with position
629 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
630 // loc.orientation = GetOrientation();
631
632 if (IsPlayer())
633 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
634 else
635 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
636}
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3167
Location ComputePosition() const
Definition MoveSpline.cpp:26
bool onTransport
Definition MoveSpline.h:127
Definition VehicleDefines.h:130
TransportBase * GetDirectTransport() const
Definition Unit.cpp:18868
Position pos
Definition Object.h:309
Definition MoveSpline.h:27
float orientation
Definition MoveSpline.h:33
float m_positionZ
Definition Position.h:57
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21019{
21020 if (!target)
21021 {
21022 return;
21023 }
21024
21026 WorldPacket data;
21027 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21028 target->SendDirectMessage(&data);
21029}
LocaleConstant
Definition Common.h:117
@ CHAT_MSG_MONSTER_WHISPER
Definition SharedDefines.h:3417
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3444
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:265
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:547

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21077{
21078 if (!target)
21079 {
21080 return;
21081 }
21082
21083 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21084 if (!bct)
21085 {
21086 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21087 return;
21088 }
21089
21091 WorldPacket data;
21092 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21093 target->SendDirectMessage(&data);
21094}
Definition ObjectMgr.h:434

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21067{
21068 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21069}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canDualWield

bool Unit::m_canDualWield

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

Referenced by Unit().

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_rootTimes

uint32 Unit::m_rootTimes
protected

Referenced by SetRooted(), and Unit().

◆ m_scAuras

AuraList Unit::m_scAuras
protected

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet

The documentation for this class was generated from the following files: